• ベストアンサー

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 の所で、「メソッドまたはデータメンバが見つかりません。」とコンパイルエラーが出てしまいます。 宜しくお願いいたします。

関連するQ&A

  • データベース操作(DAO)でのフィールド追加について

    データベース(Access)のあるテーブルのフィールドをVBのコード(プログラム)から追加したのですが、現在Appendとかいうメソッドを使ってテーブルの中にあるフィールドの一番最後尾に追加するということはできました。 しかし、好きな場所(前から2番目とか…)に挿入することができません。こんなことって可能なのでしょうか?? データベースをコードから操作する上ではフィールドがどの位置にあっても関係ないのですが、メンテナンスなども考えてできればやりたいのですが、どなたか分かる方おられたら教えてもらえませんか?? (操作方法はDAOです) どうぞよろしくお願いしますm(__)m

  • Access 2000 の VB での テーブル作成について質問です。

    下記のようにAccess 2000のVBからDAOを使ってテーブルを作っておりますが、 作るフィールドに規定値の設定もVBからできないのでしょうか?DAOだと無理なのでしょぅか? 教えてください Dim db As DAO.Database Dim tbdef As DAO.TableDef Dim flID As DAO.Field Set db = CurrentDb Set tbdef = db.CreateTableDef("テーブル") Set flID = tbdef.CreateField("ID", dbInteger)   tbdef.Fields.Append flID   db.TableDefs.Append tbdef db.Close: Set db = Nothing

  • ACCESSのFieldの追加方法

    VB初心者です。ACCESSのMDBに下記の構文でFieldの追加はできたのですが 少数点以下2桁に設定する方法がわからなく困っています。 Fieldプロパティにも無く、どなたか教えて下さい。 Set field01 = tdfEmployees01.CreateField("Tanka", dbCurrency) tdfEmployees01.Fields.Append field01

  • ACCESSデータベースにフィールドを追加したい

    ACCESSのデータベースのテーブルにフィールドを追加したい? ACCESS初心者です。 ACCESS2000で作成したデータベースのテーブルにフィールドを追加したいのですが どうすればいいですか? 例: テーブル:TABLE  フィールド   KT_ID:Short KT_NAME:Text(100) KT_ADDRESS1:TEXT(100) KT_ADDRESS2:TEXT(100) KT_CODE:Short これに テーブル:TABLE  フィールド   KT_ID:Short KT_NAME:Text(100) KT_ADDRESS1:TEXT(100) KT_ADDRESS2:TEXT(100) KT_CODE:Short KT_COMMENT:TEXT(100) →これを追加したいのですが? よろしくお願いします。

  • DAOでフィールドのデータ型を変更するには?

    Visual Basic5.0(SP3)を使用しています。 DAO3.5を使用してAccess97で作成したテーブル(既にレコードが登録されているテーブル)のフィールドのデータ型を変更したいのですが、方法はありますか? 例えば、整数型(Integer)を長整数型(Long)にといったように...。 FieldオブジェクトのTypeプロパティにセットしようとしたのですが、読み取り専 用のためできません。 トピックで 「Visual Basic の中で、DAO の Type プロパティを使って、フィールドを Fields コレクションに追加する前に、データ型を設定できます。」 と書かれてあるのを見つけました。と言う事は変更できないのでしょうか?

  • Access :ALTER TABLE で作成した文字列フィールドがトリミングされない

    いつもお世話になっております。 Access2000を使用しております。 Accessで作成した、あるシステムのバージョンアップを行っております。 その際、複数のテーブルにフィールドを追加する移行プログラムを作成しております。 Dim DB As DAO.Database Set DB = OpenDatabase("外部DB.MDB") DB.Execute ("ALTER TABLE 既存テーブル ADD 追加フィールド CHAR(255)") DB.Close 'データベースを閉じる Set DB = Nothing 上記のようなプログラムを走らせたのですが、 作成された追加フィールドにデータを入力すると、 入力した値の後に指定サイズ分の空白文字ができてしまいます。 つまり、10文字入力した場合 255-10=245文字が空白として登録されてしまいます。 Unicode圧縮プロパティのせいかな、と思い、 Dim TBL As DAO.TableDef Dim FLD As DAO.Field Dim prUC As DAO.Property Set TBL = DB.TableDefs("既存テーブル") Set FLD = TBL.Fields("追加フィールド") Set prUC = FLD.Properties("UnicodeCompression") prUC.Value = True と、フィールド追加後にプロパティを変更してみたりもしたのですが、 やはり、空白が出てしまいます。 作成したフィールドの空白文字がセットされないようにするにはどのようなことを行えばよいのでしょうか。 ご教授のほど、宜しくお願い致します。

  • Accessで既存のテーブルにシーケンシャルのフィールドを追加したい場合。

    Accessで既存のテーブルにさらにフィールドを追加し、そのフィールドにシーケンシャル番号を追加したい場合はどのようにしたらよろしいのでしょうか?

  • SQLでフィールド番号を指定する方法(VB2008

    お世話になっております。 VB2008を用いてアクセスのテーブルからデータを読み込もうとしているのですが(oledb接続)、 ・特定のフィールドからのみ値を取得したい ・そのフィールド指定は変動する これを満たす方法を、VB6では 格納変数=テーブル名.Fields(フィールド番号) によって取得出来ていたのですが、vb.netの場合どのような方法があるのかわかりません。 何かアドバイスを頂けると幸いです。

  • DAOでテーブルを作成

    DAOでテーブルを作成したいのですが 主キーにしてオートナンバー型にするにはどうすればいいですか? Sub MyTableCreate() Dim db As DAO.Database Dim tbdef As DAO.TableDef Dim Field1 As DAO.Field Dim Field2 As DAO.Field Set db = CurrentDb Set tbdef = db.CreateTableDef("T_test") Set Field1 = tbdef.CreateField("ID", dbInteger) Set Field2 = tbdef.CreateField("氏名", dbText, 20) tbdef.Fields.Append Field1 tbdef.Fields.Append Field2 db.TableDefs.Append tbdef db.Close: Set db = Nothing End Sub これで、IDフィールドを主キーにしつつ、 dbIntegerではなくオートナンバー型にしつつ、 主キーを付与する方法を教えてください。 DAOのType プロパティのヘルプを見たのですがありませんでした。 今回は http://www.accessclub.jp/dao/20.html を参考にしました。

  • VBAでのフィールド追加処理

    AccessVBAにて既に定義されているテーブルにフィールドを追加する処理にて、'**の部分でエラー(同名のフィールドが既にあるエラー)が起きます。以下の記述をしています。 フィールド追加は2つのテーブルに対して実施しています。 Do While iC < rstH.Fields.Count For Each fldLoop In tdfM.Fields sName = rstH.Fields(iC).Value If sName = fldLoop.Name Then 'H_workにはフィールドを設定 tdf1.Fields.Append tdf1.CreateField(sName, dbText, 100) Else Set fd = tdfM.CreateField(sName, dbText, 100) '空文字列の許可=true fd.AllowZeroLength = True tdfM.Fields.Append fd '** tdfM.Fields.Refresh 'Test tdf1.Fields.Append tdf1.CreateField(sName, dbText, 100) End If iC = iC + 1 If iC = rstH.Fields.Count Then Exit For End If rstH.MoveFirst Next fldLoop Loop 既に設定されているフィールド名の場合は、If sName=fldloop・・・の部分を通るはずですが、何故か 想定と違った分岐をしてしまっています。原因が解りません。どなたか教えて下さい。

専門家に質問してみよう