@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

timestamp列をnullにしてInsert文を実行するには?

投稿者投稿内容
libaty
会議室デビュー日: 2004/03/28
投稿数: 11
投稿日時: 2004-03-28 20:47
初めての書き込みになります。よろしくお願いします。

SQL Serverでtimestamp列をもったテーブルを作成し、
VS.NETのデザイナでDataAdapterなどをSQL文は何もいじらずに作成しました。
そのままで型付のDataSetを作ったので
このDataSetにはbase64binaryという列ができあがりました。
プログラミング上からはこの列に何も値を代入せずに
SQL ServerにInsert文をかけたいのですが、
「値はDBNullのため、取得できません」や「指定されたキャストは無効です」などの
エラーが出てしまいます。
Set<Column名>Nullメソッドやこのカラムにnullを代入したり、
SQL Serverでtimestamp列をNullに許可したりいろいろ試してみたのですが、
どれもダメでした。

Insert文からtimestamp列を削除してしまえばいいというのはわかっているのですが、
できれば違う方法で実現したいと思っています。
お知恵を拝借させていただければ幸いです。よろしくお願いします。
ジエゴ
常連さん
会議室デビュー日: 2003/12/08
投稿数: 26
お住まい・勤務地: ヨコハマ
投稿日時: 2004-03-29 01:22
libatyさん、はじめまして。

Books Online は読まれましたか?
もしまだであれば一度imestamp型についてお読みください。。。
libaty
会議室デビュー日: 2004/03/28
投稿数: 11
投稿日時: 2004-03-29 09:51
早速のご指摘ありがとうございます。
Books Onlineのtimestamp型について読んだことがなかったので、timestamp型とついでにtimestamp列のところを眺めてみました。

「自動的に更新するからいじらないで」ということを書いているのかなという印象を受けたのですが、それと今回できないことがどうしても繋がりません。
そもそも以下みたいなことはしないのでしょうが、クエリアナライザを使って、
insert into Table (ID, Name, Stamp) values (1, 'libaty', (null))
ができるのに、なんで.NETでDataSetを使うとダメなのかがどうしても理解できませんでした。

もうしわけありませんが、もう少し皆さんのお知恵を拝借できないでしょうか。
よろしくお願いします。
ジエゴ
常連さん
会議室デビュー日: 2003/12/08
投稿数: 26
お住まい・勤務地: ヨコハマ
投稿日時: 2004-03-29 10:41
そのSQLの実行結果をご覧になりましたか?
テーブルには期待した結果が反映されていますか?
libaty
会議室デビュー日: 2004/03/28
投稿数: 11
投稿日時: 2004-03-29 10:48
上記のinsert文を実行した結果ですが、
timestamp列のStampには
Enterprise Managerで見ると <binary>
クエリアナライザで見ると 0x000000000012E6AD
という値が入っています。

timestamp列について正しい理解をできているかわかりませんが、
このような結果が得られたのでちゃんと入っているのではないかと考えています。
そもそもこのへんの認識がおかしいのでしょうか?
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-03-29 11:05
おそらく流れは以下のようになっていると思いますが、どの場所でエラーが発生しているか
教えていただけないでしょうか?

1)新規行作成
2)新規行の各項目に値を設定
3)新規行をデータセット内のテーブルに追加
4)データアダプタのUpdateメソッドでDB更新

3)と4)だと原因が違ってくるので
libaty
会議室デビュー日: 2004/03/28
投稿数: 11
投稿日時: 2004-03-29 11:20
ゆうじゅんさん、はじめまして。

最初に書きましたExceptionメッセージは全部
4)DataAdapterのUpdateメソッドでDB更新
のところで発生しています。

ご参考までに、
DataSetのbase64binary列(SQL Serverではtimestampになっているところ)
はNillable = trueになっています。

どうぞ、よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-29 11:36
引用:

timestamp

 timestamp は自動生成されたバイナリ値を公開するデータ型です。これらの値は、データベース内で一意であることが保証されます。timestamp は、通常、テーブル行にバージョンスタンプを付けるメカニズムとして使用されます。記憶領域のサイズは 8 バイトです。


 ユーザは変更できない。

 変更できたら『データベース内で一意であることが保証』できなくなります。

蛇足:
 「2004-03-29 10:48」の投稿で
引用:

上記のinsert文を実行した結果ですが、
timestamp列のStampには
Enterprise Managerで見ると <binary>
クエリアナライザで見ると 0x000000000012E6AD
という値が入っています。


ということですが、nullを放り込んだはずなのに、null以外の値が入っていることを、なぜ「おかしい」と思わずに、『ちゃんと入っているのではないか』と考えられたのでしょう?

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-03-29 11:46 ]

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