ODBC経由にてMDBテーブルに新規フィールドを任意の位置に挿入できない

[戻る]
えりたまSpecial [E-Mail] 2014/01/03(金) 17:39:42
■動 作 環 境 :WindowsXP
■開 発 環 境 :.NET2002 (MFC形式,ODBC接続)
■データベース:Access2000

はじめまして。自作のプログラムをアップデートする際にデータベースのフィールドを
新規に追加したいのですが、うまくいきません。

CContinueCountTable ContinueCount;
try {

// ContinueCountテーブルを開いて排他エラー発生しなければそのまま閉じる
ContinueCount.Open();
                ContinueCount.Close();
            }
            catch(CDBException* pEx) {

                // DETECT_TYPE16フィールドを追加
                try {

                    CDatabase db ;
                    db.OpenEx("DSN=BLISPECTOR3_S", 
CDatabase::noOdbcDialog) ;


/*
                    db.ExecuteSQL("alter table 
CONTINUE_COUNT add DETECT_TYPE16 LONG after DETECT_TYPE15") ;
*/
                    db.ExecuteSQL("alter table 
CONTINUE_COUNT add DETECT_TYPE16 LONG") ;

えりたまSpecial [E-Mail] 2014/01/03(金) 17:51:57
使い慣れれないので途中でお送りしてしまいました。すみません

ContinueCountテーブルが

フィールド名
================
NO (PRIMARY KEY)
TYPE1 (LONG)
TYPE2 (LONG)
TYPE3 (LONG)

例えばTYPE2とTYPE3の間に新規にフィールドTYPE5を挿入したいのですがうまくいきませ
ん。以下のコードのように

CContinueCountTable    ContinueCount;
try {
    // ContinueCountテーブルを開いて排他エラー発生しなければそのまま閉じる
    ContinueCount.Open();
    ContinueCount.Close();
}
catch(CDBException* pEx) {
    // TYPE5フィールドを追加
    try {
        CDatabase db ;
        db.OpenEx("DSN=BLISPECTOR3_S", CDatabase::noOdbcDialog) ;

        db.ExecuteSQL("alter table CONTINUE_COUNT add TYPE5 LONG") ;

        db.Close() ;
    }
    catch(...) {
        // 既にフィールドが存在する場合
        if(Stat.IsOpen()) {
            Stat.Close();
        }
    }
}

すると

フィールド名
================
NO (PRIMARY KEY)
TYPE1 (LONG)
TYPE2 (LONG)
TYPE3 (LONG)
TYPE5 (LONG)

のようになるのですが。アドバイスお待ちしております。

επιστημη 2014/01/03(金) 21:32:39
「"TYPE2とTYPE3の間"に挿入せよ」と、どこで指定しているんでしょうか?

a 2014/01/06(月) 15:54:04
エンドユーザーがAccess等を使用して直にデータをいじるのなら

別でしょうが、大体の場合はアプリケーションを通してデータにアクセ

スするでしょうからそもそもそんなことやる必要性を感じないですね。



俺は、途中に入れる方法は知らないので第2候補として別のアプローチ

方法を記載しておきます。(新規列の初期値は0でいいか不明)



トランザクション

select NO, TYPE1, TYPE2, 0 as TYPE5 , TYPE3 into hoge from ContinueCount

PrimaryKey設定

(必要に応じて)Index設定

ContinueCount テーブル削除(テスト時は戻せるようにリネームの方がいい。)

hopgeをContinueCountにリネーム

コミット

エラー時はロールバック



またはCreate Tableで新しいテーブルを作成してInsert Intoしてリネームするか。

えりたまSpecial [E-Mail] 2014/01/08(水) 22:51:03
[[解決]]
aさん アドバイスありがとうございます。

色々試してみましたが、オリジナルのテーブルを操作するのはどうもうまくいかないよ
うです。

したがって、aさんの

>またはCreate Tableで新しいテーブルを作成してInsert Intoしてリネームするか。

という方法がもっとも実現性があると思いました。

この方法でトライしてみます。

どうもありがとうございました。

古いスレッドには追加発言できません。