- PR -

プロパティ 'Item' は 'ReadOnly' です。

投稿者投稿内容
かつや
ベテラン
会議室デビュー日: 2004/01/19
投稿数: 70
投稿日時: 2004-01-19 14:31
件名のようなエラーメッセージに悩まされております。
ADOXを使用して、MDBを作成しているのですが、
下記のソースをどのように修正すべきなんでしょうか?


With tbl
.Name = strTable
.ParentCatalog = cat
With cat.Tables(strTable).Columns
.Append("DataStorage_Id", ADOX.DataTypeEnum.adInteger)
.Item("DataStorage_Id").Properties("Nullable") = True
.Append("Filename", ADOX.DataTypeEnum.adWChar, 255)
.Append("DefaultOrder_Id", ADOX.DataTypeEnum.adInteger)
.Append("Category_Id", ADOX.DataTypeEnum.adSmallInt)
.Append("SubCategory_Id", ADOX.DataTypeEnum.adSmallInt)
.Append("Search_Keys", ADOX.DataTypeEnum.adLongVarWChar)
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2004-01-19 14:40
With tbl
.Name = strTable
.ParentCatalog = cat

With cat.Tables(strTable).Columns
.Append("DataStorage_Id", ADOX.DataTypeEnum.adInteger)
★.Item("DataStorage_Id").Properties("Nullable") = True
.Append("Filename", ADOX.DataTypeEnum.adWChar, 255)
.Append("DefaultOrder_Id", ADOX.DataTypeEnum.adInteger)
.Append("Category_Id", ADOX.DataTypeEnum.adSmallInt)
.Append("SubCategory_Id", ADOX.DataTypeEnum.adSmallInt)
.Append("Search_Keys", ADOX.DataTypeEnum.adLongVarWChar)

★の箇所が問題だと思います。
MDB側でNullを許すかどうか調べた上で、
.Append("DataStorage_Id", ADOX.DataTypeEnum.adInteger)

ADOX.DataTypeEnum.adIntegerの値が
Nullになるかどうか調べてみてはいかがでしょう?
かつや
ベテラン
会議室デビュー日: 2004/01/19
投稿数: 70
投稿日時: 2004-01-19 15:00
>ADOX.DataTypeEnum.adIntegerの値が
>Nullになるかどうか調べてみてはいかがでしょう?

なります。
ACCESSで作ったMDBでは、大丈夫でした。

.Item("DataStorage_Id").Properties("AutoIncrement") = True
ともダメです。
プロパティの設定自体できないみたいです。

ネットで調べても、同様の現象の記事は皆無なので途方にくれてます。。。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2004-01-19 15:37
僕の認識とずれてますのでコメントさせていただきます。

★.Item("DataStorage_Id").Properties("Nullable") = True
のコードで記述している内容は、
.Item("DataStorage_Id"という項目の).Properties("Nullable"を許すかどうかを)
True (可能)にしている。

と言う意味です。

データベースのスキーマ(データ格納方法)をプログラムから後決めで指定する。
のは原則的に反則です。

具体例)
1.テーブルがあります。
2.2行のテーブルです。
3.最初に文字列だけ格納できる!と宣言している

以上の状況で、「やっぱり数字だけ入れたい!」ってしたら、
格納されているデータの「文字列」はどうしましょう?

そうならない為に、「データベースの格納方法」は原則的にいじらないようにするのが
良いと考えます。

そのコードの行の指定が無いといけないのでしょうか?
指定しなくていいことをワザワザ指定していると言う認識です。

僕は
★.Item("DataStorage_Id").Properties("Nullable") = True
の行が必要ないと考えているわけですが、
必要ですか?

もし必要だとしたら、
「何故必要なのか」を教えて頂けますか?

宜しくお願いします。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-01-19 15:38
こんにちは

>.Item("DataStorage_Id").Properties("Nullable") = True
この部分をはずしてみたらどうなりますか?


ItemプロパティがReadOnlyなのに値を設定しているからエラーになっているのでは
ないでしょうか?

かつや
ベテラン
会議室デビュー日: 2004/01/19
投稿数: 70
投稿日時: 2004-01-19 15:47
>もし必要だとしたら、
>「何故必要なのか」を教えて頂けますか?

VB .NET でMDBファイル(データベース)を作成して、それから、レコード等を挿入するツールを作っております。

前もって、ACCESSのMDBがあるわけではないです。

よって、テーブル作成、テーブル定義等もプログラムでやっています。

その過程で、↓を参考にしながら作ってみたのですが。。。
http://homepage2.nifty.com/inform/vbdb/adox_column.htm
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-01-19 16:06
サンプルは項目定義をしてから追加していますが
かつやさんは追加してから項目定義を「変更」しているからだめだと思います

理由はるぱんさんが書いている通りと思います。
かつや
ベテラン
会議室デビュー日: 2004/01/19
投稿数: 70
投稿日時: 2004-01-19 16:14
>サンプルは項目定義をしてから追加していますが
>かつやさんは追加してから項目定義を「変更」しているからだめだと思います

その辺りも↓のように試してみたんですが。。。
なんでダメなんだろう。。。


With cat.Tables(strTable).Columns
.Item("DataStorage_Id").Properties("AutoIncrement") = True
.Append("DataStorage_Id", ADOX.DataTypeEnum.adInteger)
.Append("Filename", ADOX.DataTypeEnum.adWChar, 255)
.Append("DefaultOrder_Id", ADOX.DataTypeEnum.adInteger)
.Append("Category_Id", ADOX.DataTypeEnum.adSmallInt)
.Append("SubCategory_Id", ADOX.DataTypeEnum.adSmallInt)
.Append("Search_Keys", ADOX.DataTypeEnum.adLongVarWChar)
End With

スキルアップ/キャリアアップ(JOB@IT)