• ベストアンサー

ACCESSデータベースにVB6(DAO)でフィールドを追加したい

既存のACCESSデータベースのテーブルにVB6のDAOでフィールドを追加したいのですが、テーブル名.Fields.Append とかいうメソッドがあるようですが、使用方法がわからずフィールドを追加が出来ません。 具体的には、フィールド名"電話番号"で、文字型で固定文字数13を追加したいのです。 どうぞよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

VB6.0からDA0を使用して、既存のAccessのテーブルへのフィールド追加、という事でしたら以下のコードで出来ました。 Sub Main() Dim dbs As DAO.Database Dim s_sql As String Set dbs = OpenDatabase("C:\test.mdb") s_sql = "ALTER TABLE テーブル名 ADD COLUMN フィールド1 TEXT(10)" dbs.Execute s_sql Set dbs = Nothing End Sub

YSScyan
質問者

お礼

ありがとうございました。 短いコードで出来よろこんでいます。 色んな方法があるのですね。 とても勉強になりました。

YSScyan
質問者

補足

追加したフィールドを表示すると「Nullの使い方が不正です。」と出ます。 表示でエラー処理をするといいのですが、SQL記述で""をセット出来ないのでしょうか?

その他の回答 (6)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.7

>tbl.Fields("電話番号").???????? = "" とかで""をセットするフィールドプロパティはないのでしょうか? ないです。 プロパティというのは属性、初期値、規約などの性格を決めるだけで、 現存するレコードの、あるいは追加されたフィールドの値を設定/更新 するものではありません。 つまり、「プロパティを設定/変更する」と、「値を設定/変更する」は 全く違う行為です。プロパティを変更しただけで、値まで変わって しまうようなシステムでは危なくて誰も使えないでしょう。

YSScyan
質問者

お礼

回答ありがとうございました。 初期値としてNULLでなく""をセット出来ないかと思って書いたのですがNULLしかセット出来ないのですね。

回答No.6

「Nullの使い方が不正です」が表示される状況が こちらでは掴めないので、すみませんが推測になります。 新しく追加したフィールドの「値要求」と「空文字列の許可」の設が関係しているような気がします。 まだ解決されてない様でしたら、 テーブルの上記のフィールドプロパティを直接直しみて、 現象が改善されるか確認してみて頂けますか? 改善されるようでしたら、 下記のコードの様に、 フィールド追加時に「値要求」は「いいえ」、 「空文字列の許可」は「はい」の設定を プラスしてやればOKだと思います。 (コード自体の動作確認はしてあります。) Sub フィールド追加テスト2() Dim dbs As DAO.Database Dim tbl As DAO.TableDef Dim s_sql As String Set dbs = OpenDatabase("C:\test.mdb") 'フィールドの追加 s_sql = "ALTER TABLE テーブル名 ADD COLUMN フィールド2 TEXT(10)" dbs.Execute s_sql 'フィールドプロパティの設定 Set tbl = dbs.TableDefs("テーブル名") tbl.Fields("フィールド2").Required = False '値要求 tbl.Fields("フィールド2").AllowZeroLength = True '空文字列の許可 Set tbl = Nothing dbs.Close Set dbs = Nothing End Sub

YSScyan
質問者

補足

テーブルの上記のフィールドプロパティを直接直してみて、nda23 さんから教わったCurrentDb.Execute "UPDATE Youken SET 電話番号=''" をやるとエラーはでなくなりましたので、フィールドプロパティの設定をするプログラム追加しその後、 CurrentDb.Execute "UPDATE Youken SET 電話番号=''" をやると全てプログラムから出来る様になりました。 CurrentDb.Execute "UPDATE Youken SET 電話番号=''" じゃなく tbl.Fields("電話番号").???????? = "" とかで""をセットするフィールドプロパティはないのでしょうか?

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.5

>追加したフィールドを表示すると「Nullの使い方が不正です。」 どういう表示のしかたをしたのでしょう?データシートビューなら 開けるはずです。 追加したフィールドの最初の設定値はNullです。空文字列にしたい 場合はフィールド追加後に「UPDATE テーブル SET 新フィール=""」を 実行しなければなりません。 cf. CurrentDb.Execute "UPDATE テーブル SET 新フィールド=''"

YSScyan
質問者

補足

アドバイスありがとうございます。 >どういう表示のしかたをしたのでしょう? フォームのテキストボックスに表示しようとしただけです。 CurrentDb.Execute "UPDATE Youken SET 電話番号=''" を追加してみましたがダメでした。 ACCESS で直接テーブルのデザインを見てみたら、空文字列の許可項目が’いいえ’になっていますが関係あるのでしょうか?

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

Dim S As DAO.TableDefs Dim T As DAO.TableDef Dim F As DAO.Field Set S = CurrentDb.TableDefs Set T = S("Table") '★実際のテーブル名に合わせてください Set F = T.CreateField("NewName", dbText, 50) '★ T.Fields.Append F CreateField(DAO)のヘルプを参照してみてください。 基本的に複数形で表現してあるものはコレクション(集団)で 単数形のものはオブジェクトです。 (1)テーブル定義コレクションを記録する (2)コレクションから名前を指定してテーブル定義オブジェクトを取得する。 (3)フィールドを作成する。テーブル定義オブジェクトのメソッドだが   できたフィールドオブジェクトとは関連付かない。 (4)テーブルの中のフィールド・コレクションに上記を追加(Append)する。 尚、Set S = CurrentDb.TableDefs を省略して Set T = CurrentDb.TableDefs("Table") とやると失敗します。 これは昔(10年以上前)からあるクセでオカシイとは思ってるんですが、 直りませんね。 あと、インデックスやプロパティも同様の感覚で作れます。

YSScyan
質問者

お礼

回答ありがとうございます。 いくつかの回答を見てわかって来た気がします。 まだ完全じゃありませんが..... 追加したフィールドを表示すると「Nullの使い方が不正です。」と出ます。 表示でエラー処理をするといいのですが、追加(Append)するとき""をセット出来ないのでしょうか?

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

ごめんなさい 1つプロパティが抜けてました   tbldef.Fields.Append newFld Fieldsが抜けておりました m(__)m

YSScyan
質問者

お礼

出来ました。 ありがとうございました。 私に応用力があれば気づくんだったんでしょうけどすみません。 もっと勉強したいと思います。 また何かありましたらよろしくお願いいたします。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

DAOでやるなら そのテーブルのTableDefオブジェクトを取得して CreateFieldでFieldオブジェクトを生成 Appendメソッドで追加 といった手順です ' MDBファイルを objDB(DAO.Database型)に取得してあると仮定 Dim objTBLDef as TableDef Dim objFld as Field Set objTblDef = objDB.TableDefs("テーブル名") on error resume next ' 列:電話番号があるかをチェック set objFiel = objTBLDef.Fields("電話番号") On error goto 0 if objFld Is Nothing then   ' 新規に 列:電話番号を作成   Set objFld = objTBLDef.CreateField("電話番号", dbText, 13 )   ' テーブルに 電話番号を追加   objTBLdef.Append objFld End if set objFlg = nothing Set objTBLdef = nothing

YSScyan
質問者

補足

早速のご回答ありがとうございます。 いろいろやってみましたが解決しません。 'MDBファイルを objDB(DAO.Database型)に取得してあると仮定 とありますが、MDBファイルをopen するといいのでしょうか? Set objDB = Workspaces(0).OpenDatabase(App.path "\Data\master.mdb") を付け加えてしてやっていましたが、objTBLdef.Append objFld の所で、「メソッドまたはデータメンバが見つかりません。」とコンパイルエラーが出てしまいます。 宜しくお願いいたします。