vb からアクセスのテーブル作成時のプロパティーの設定方法を教えてください。

値要求 のプロパティーを Falseにしたいのですが、DAOでは「フィールドの Required プロパティにアクセスするには、DAO の Required プロパティを使います。」だそうですが ADO、ADOX での設定の仕方がわかりません。
知っている方がおられたら教えて下さい。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

僕のPCのMSDNにあったのですが、ネット上のMSDNで同じページが見つからなかったので、コピペします。



ParentCatalog の例


次のコードで、テーブルをカタログに追加するより前にプロバイダに固有のプロパティにアクセスするための、ParentCatalog プロパティの使用法を示します。

Sub SetAllowZeroLength()

  Dim cnn As New ADODB.Connection
  Dim cat As New ADOX.Catalog
  Dim tbl As New ADOX.Table
  Dim col As New ADOX.Column

  cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
   "Data Source= c:\Program Files\" & _
   "Microsoft Office\Office\Samples\Northwind.mdb;"
  Set cat.ActiveConnection = cnn
  tbl.Name = "MyTable"
  tbl.Columns.Append "Column1", adInteger
  Set col.ParentCatalog = cat
  col.Name = "Column2"
  col.Type = adVarWChar
  col.Properties("Jet OLEDB:Allow Zero Length") = True
  tbl.Columns.Append col
  cat.Tables.Append tbl

End Sub
    • good
    • 0
この回答へのお礼

ありがとうございました!!!

お礼日時:2002/03/02 09:36

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QADOX フィールドのRequiredプロパティを

ADOX フィールドのRequiredプロパティをFalseにしたい

アクセスです。

Sub test()
Dim cat As ADOX.Catalog
Dim tbl As ADOX.Table
Dim idx As ADOX.Index
Dim varRet As Variant
Dim strMsg As String

Set cat = New ADOX.Catalog
cat.ActiveConnection = CurrentProject.Connection

Set tbl = New ADOX.Table
tbl.Name = "test"

tbl.Columns.Append "氏名ID", adInteger '手作業で数値型のフィールドを作るとこれがデフォルトになる
tbl.Columns.Append "氏名", adVarWChar, 50

cat.Tables.Append tbl

主キーを作る
Set idx = New ADOX.Index
idx.Name = "Primary"
idx.PrimaryKey = True
idx.Columns.Append "氏名ID"

tbl.Indexes.Append idx

MsgBox tbl.Name & "テーブルを作成しました。"

Set cat = Nothing
End Sub
**********************************************************

上記のコードでテーブルを作ると、RequiredをTrueにしてないのに、
実際にテーブルにデータを入れてる時に、NULLにしようとすると、

**********************************************************
フィールドに必要なプロパティが True に設定されているため、
このフィールド '<フィールド名>' には Null 値は挿入できません。値を入力してください。
**********************************************************
となります。

Requiredプロパティの規定値は、False になってますが、
なぜか値を要求されてしまいます。

ADOXで上記のコードに追加してRequiredをFalse にする方法を教えてください。、

ADOX フィールドのRequiredプロパティをFalseにしたい

アクセスです。

Sub test()
Dim cat As ADOX.Catalog
Dim tbl As ADOX.Table
Dim idx As ADOX.Index
Dim varRet As Variant
Dim strMsg As String

Set cat = New ADOX.Catalog
cat.ActiveConnection = CurrentProject.Connection

Set tbl = New ADOX.Table
tbl.Name = "test"

tbl.Columns.Append "氏名ID", adInteger '手作業で数値型のフィールドを作るとこれがデフォルトになる
tbl.Columns.Append "氏名", adVarWC...続きを読む

Aベストアンサー

当方、Access2010 です。同じ結果になりました。。
無理っぽいと思いつつGoogleと外人さんが教えてくれました。
http://www.pcreview.co.uk/forums/re-change-field-required-property-adox-t1685138.html

tbl.Columns.Append "氏名ID", adInteger '手作業で数値型のフィールドを作るとこれがデフォルトになる
tbl.Columns.Append "氏名", adVarWChar, 50
tbl.Columns("氏名").Attributes = adColNullable '追加

では?

QVBScriptでAccessMDBにテーブルを作成時、値要求はいのフィールドが作成できない。

Access97で使用しているデータベースに、
スクリプトでテーブルを作成する必要が出てきたので、
作成してみたのですが、プロパティで値要求を「はい」に設定しているにも関わらず、
設定する事が出来ませんでした。

設定の仕方が悪いのでしょうか?
下記にサンプルソースを上げました。

教えて頂けると助かります。
よろしくお願い致します。
--------------------------------------
Option Explicit

'データベースパス
Dim strDBPath
Dim strDBName
strDBName = "db1.mdb"
Dim strDBFullPath 'ファイルが存在する場所
strDBFullPath = Replace(WScript.ScriptFullName,WScript.ScriptName, "")
'FileSystemObject
Dim objFS
'SQL文
Dim strSQL
'テーブル名
Const strTBL = "テスト"
'ADOX用定義
Const adBoolean = 11 'ブール値型

Const adColFixed = 1 '値要求 はい
Const adColNullable = 2 '値要求 いいえ

Dim objCat
Dim objTbl
Dim objCol

'ADOオブジェクトを作成します
Set objCat = WScript.CreateObject("ADOX.Catalog")
Set objTbl = WScript.CreateObject("ADOX.Table")

Dim strJoin
strJoin = ""
strJoin = strJoin & "Provider=Microsoft.Jet.OLEDB.4.0;"
strJoin = strJoin & "Data Source=" & strDBFullPath & strDBName & ";"
strJoin = strJoin & "Jet OLEDB:Engine Type=5;"

objCat.ActiveConnection = strJoin
'テーブル名を定義します
objTbl.Name = strTBL
objCat.Tables.Append objTbl

'■列の設定
'フラグ Yes/No型 はい -
Set objCol = WScript.CreateObject("ADOX.Column")
With objCol
' フィールド名
.Name = "フラグ"
' データ型
.Type = adBoolean
' 値要求 はい
.Attributes = adColFixed
End With
objCat.Tables(strTBL).Columns.Append objCol
Set objCol = Nothing

Set objTbl = Nothing
Set objCat = Nothing

Access97で使用しているデータベースに、
スクリプトでテーブルを作成する必要が出てきたので、
作成してみたのですが、プロパティで値要求を「はい」に設定しているにも関わらず、
設定する事が出来ませんでした。

設定の仕方が悪いのでしょうか?
下記にサンプルソースを上げました。

教えて頂けると助かります。
よろしくお願い致します。
--------------------------------------
Option Explicit

'データベースパス
Dim strDBPath
Dim strDBName
strDBName = "db1.mdb"
Dim strDBFul...続きを読む

Aベストアンサー

97の環境がありませんので、実験していませんが、
ADOでコネクションを開き、
strSQL = CON.Execute "ALTER TABLE TABLE2 ALTER COLUMN FIELD1 TEXT(30) NOT NULL"
のようなSQLを発行することによって、「値要求」を「はい」にすることはできます。
既に存在しているデータに制約に違反するものがある場合は、エラーが起きて実行できなかったと思います。
ただし上記SQLをNULLに変えても、NULL値禁止制約は解除されません。(逆向きの操作はできません。)

もひとつ別情報としては、CREATE TABLE の CONSTRAINTでは、NULL値禁止制約を設定することはできません。

(ソースは見つけられません。)

昔、この件で悩んだ事があったような、なかったような・・・

(mdbを)ご利用の際は計画的に!

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

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

Aベストアンサー

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

QADOをし使用して、Accessのテーブルの中のフィールドを消したいのですが。

タイトル通りなんですけど、
テーブルにあるフィールドを追加、削除したいのですが、
どうしたらいいのか全くお手上げ状態です。
助けてください。

ADOを使用しています。
お願いします。

Aベストアンサー

こんにちは。maruru01です。
テーブルにあるフィールドの追加や削除は、ADOの拡張機能であるADOXを使用します。

まず、ADOと同じように参照設定でライブラリを追加します。
ライブラリ名は「Microsoft ADO Ext.2.5 for DDL and Security」です。(バージョンが2.5でないかも知れません。)
そうしたら、後はADOとだいたい同じで、オブジェクト変数を宣言して、新規オブジェクトへの参照を代入します。

Dim cat As ADOX.Catalog
Dim Tbl As ADOX.Table

Set cat = New ADOX.Catalog
cat.ActiveConnection = CurrentProject.Connection
Set Tbl = cat.Tables![テーブル名]

'フィールドの追加
Tbl.Columns.Append "追加フィールド名", adWChar
'フィールドの削除
Tbl.Columns.Delete "削除フィールド名"

Set Tbl = Nothing
Set cat = Nothing

Append、Deleteメソッドの引数など詳しいことは、MSDN Libraryなどで調べて下さい。
では。

こんにちは。maruru01です。
テーブルにあるフィールドの追加や削除は、ADOの拡張機能であるADOXを使用します。

まず、ADOと同じように参照設定でライブラリを追加します。
ライブラリ名は「Microsoft ADO Ext.2.5 for DDL and Security」です。(バージョンが2.5でないかも知れません。)
そうしたら、後はADOとだいたい同じで、オブジェクト変数を宣言して、新規オブジェクトへの参照を代入します。

Dim cat As ADOX.Catalog
Dim Tbl As ADOX.Table

Set cat = New ADOX.Catalog
cat.ActiveConnect...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QADOXでmdbファイルにオートナンバー型フィールド作成するとエラー

ADOXを使ってmdbファイルを作るときに、オートナンバー型フィールドを作るステートメントを入れると
「Microsoft JET Database Engine (0x80040E21)
複数ステップの OLE DB の操作でエラーが発生しました。各 OLE DB の状態の値を確認してください。作業は終了しませんでした。」
というエラーになります。
試しにオートナンバーにしないと、正常にmdbファイルが作成されます。

対処法をご存知の方、是非とも教えてください。

以下がソースの一部です。

Set catDB = CreateObject("ADOX.Catalog")
catDB.Create "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\hoge.mdb"

Set tbl = CreateObject("ADOX.Table")

With tbl
.Name = "Contacts"
Set .ParentCatalog = catDB

With .Columns
.Append "ContactId", adInteger
' ContactId フィールドをオートナンバー型に設定します。
.Item("ContactId").Properties("AutoIncrement") = True
.Append "CustomerID"
.Append "Phone"
End With
End With

catDB.Tables.Append tbl←ここでエラーになります。

Set catDB = Nothing

ADOXを使ってmdbファイルを作るときに、オートナンバー型フィールドを作るステートメントを入れると
「Microsoft JET Database Engine (0x80040E21)
複数ステップの OLE DB の操作でエラーが発生しました。各 OLE DB の状態の値を確認してください。作業は終了しませんでした。」
というエラーになります。
試しにオートナンバーにしないと、正常にmdbファイルが作成されます。

対処法をご存知の方、是非とも教えてください。

以下がソースの一部です。

Set catDB = CreateObject("ADOX.Catalog")...続きを読む

Aベストアンサー

こちらでは、上記のソースで正常に作成できました。
なんでMDACのバージョン等の問題かと。

最新のものを入手して試してみてください。

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QAccess2003でのテーブルの有無確認

こんにちは。
VB6.0 Access2003にて開発をしています。

Test.mdbにTableAという名前テーブルが存在していたら
削除を行うという処理をしたいのですが
TableAという名前テーブルが存在しているかどうかを
調べる方法がわかりません。

TableAをオープンさせてエラー番号で判断するやり方
ならわかるのですが、ほかに方法はないのでしょうか?

Aベストアンサー

No2です。 
カタログのコネクションを間違えました。 
申し訳ありません。

cat.ActiveConnection = "Provider=Microsoft.jet.OLEDB.4.0; data source = C:\folder\dbname.mdb"
と置き換えてください。
あとお分かりだとは思いますが、
if tba.type = "TABLE" then

if tbl.type・・・・・
としてください。

QVBAにてデータが数字か文字かを判定するには

VBAにてデータが数字か文字かを判定するには、
どうすれば良いのでしょうか?

文字数は任意で決まっていません。


123 ← 数字
あい ← 文字
1F  ← 文字
G  ← 文字

Aベストアンサー

こんにちは。

数字か文字かなら、IsNumeric でよいと思いますが、数値か文字かでしたら、VarType を使います。私の場合は、IsNumericは、めったに使いません。VarTypeのほうが多いですね。IsNumeric は、文字通り、文字か数字かで、文字列書式の数字も含まれます。なお、VBAでは、数字は、数値型に型キャストされますので、特に問題は発生しません。

ご参考までに。

Sub Test()
 If VarType(Range("A1").Value) = vbDouble Then
  MsgBox "数値"
 ElseIf VarType(Range("A1").Value) = vbString Then
  MsgBox "文字列"
 Else
  MsgBox "その他" '代表的なものはエラー値です
 End If
End Sub

-----------------------------------------
こちらの場合は、全角数字も、数字として扱われます。

Sub Test2()
 If IsNumeric(Range("A1").Value) Then
   MsgBox "数字"
 Else
   MsgBox "数字ではない"
 End If
End Sub

こんにちは。

数字か文字かなら、IsNumeric でよいと思いますが、数値か文字かでしたら、VarType を使います。私の場合は、IsNumericは、めったに使いません。VarTypeのほうが多いですね。IsNumeric は、文字通り、文字か数字かで、文字列書式の数字も含まれます。なお、VBAでは、数字は、数値型に型キャストされますので、特に問題は発生しません。

ご参考までに。

Sub Test()
 If VarType(Range("A1").Value) = vbDouble Then
  MsgBox "数値"
 ElseIf VarType(Range("A1").Value) = vbString Th...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング