- PR -

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

投稿者投稿内容
libaty
会議室デビュー日: 2004/03/28
投稿数: 11
投稿日時: 2004-03-29 15:31
引用:

noderaさんの書き込み (2004-03-29 15:16) より:

>今回の一件はそもそも、デザイナでDataAdapterから作成されるSqlCommand達を編集せずに
この1文が最初の質問に入っていれば、誤解が少なくてすんだかもしれませんね。


もう大反省というところです。
皆さんには貴重なお時間を割いてまでお付き合い頂いているのに申し訳なく思います。

noderaさんに示して頂いたページや「プログラミング ADO.NET」を参考に
どんな風にしているのか理解し、その方法を用いようと思います。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-03-29 15:49
こっちで試してみましたが「timestamp型にはDBNull以外の値を設定できません」
のエラーが発生しました。
このエラーはそちらでも発生しました?

どうもエラー内容をみるとDataAdapter.Update以外で発生してるっぱいのですが
もしお手数でなければDataAdapter.Updateをはずしてどうなるか見ていただけないでしょうか
libaty
会議室デビュー日: 2004/03/28
投稿数: 11
投稿日時: 2004-03-29 16:05
引用:

ゆうじゅんさんの書き込み (2004-03-29 15:49) より:

こっちで試してみましたが「timestamp型にはDBNull以外の値を設定できません」
のエラーが発生しました。
このエラーはそちらでも発生しました?

どうもエラー内容をみるとDataAdapter.Update以外で発生してるっぱいのですが
もしお手数でなければDataAdapter.Updateをはずしてどうなるか見ていただけないでしょうか


上記のエラーですが、timestampの列に「null」を代入すると起こりました。
何も入れなかった場合には「DBNullのため取得できません」となります。

DataAdapter.Updateをはずしてというのは、コメントにして実行しないということでよろしいですか?
その場合には上記のようなエラーはなにもでませんでした。

ちなみに、nullを入れた場合にはDataSetのtimestamp列のSetプロパティで例外がでて
それ以外の場合には同じプロパティのGetの方で例外がでてました。
libaty
会議室デビュー日: 2004/03/28
投稿数: 11
投稿日時: 2004-03-29 18:03
noderaさんに教えて頂いたサイトや書籍を引っ掻き回していろいろ眺めてみたのですが、
同時実行制御などをカスタム制御したい場合にtimestamp列を使って云々という記述は
両方で見つけることができましたが、ここにあることは今回のこととは関係なさそうでした。

今回は単純にデザイナが作ったComanndそのままにDataSetを使ってUpdateメソッドを呼ぶときに(実際にはInsert文が実行される)なんでtimestamp列を空白やnullにして実行できないのか?
ということなので、同時実行制御や再読み込みはあまり関係なさそうでした。

わざわざ示していただいたのに申し訳ありません。
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2004-03-29 20:11
回答があさってな方向を向いていたようで、申し訳ありませんでした。
とりあえず自分もこの話題興味があったのでいろいろ試してみましたが、同じようにDataSetにTimestamp型を含んだまま自動生成したコマンドでは動作させることができませんでした。

そもそも、クエリーアナライザーでも(3番目のフィールドがtimestamp型と仮定)
Insert TimestampTable values(1, '名前', NULL)
のような構文はOKですが、

declare @nullvalue timestamp
set @nullvalue = null
Insert TimestampTable values(1, '名前', @nullvalue)

はNGです。

DataAdapterのUpdateを走らせたときに、SQLプロファイラで見ると同じようにvarbinary(8)の変数にNULLを突っ込んで実行しようとしています。

例)
exec sp_executesql N'INSERT INTO TimestampTable(code, name, tmstmp) VALUES (@code, @name, @tmstmp); SELECT code, name, tmstmp FROM TimestampTable WHERE (code = @code)', N'@code int,@name varchar(50),@tmstmp varbinary(8)', @code = 1, @name = 'ABC', @tmstmp = NULL

結果的には、上のNG構文と同じになるので、そもそもSQLサーバー自体がtimestamp型へ変数値での代入を認めていないようです。

となると、この場合「Commandを編集せずに」というのは無理かもしれませんね。




[ メッセージ編集済み 編集者: nodera 編集日時 2004-03-29 20:14 ]
libaty
会議室デビュー日: 2004/03/28
投稿数: 11
投稿日時: 2004-03-30 11:35
引用:

noderaさんの書き込み (2004-03-29 20:11) より:

結果的には、上のNG構文と同じになるので、そもそもSQLサーバー自体がtimestamp型へ変数値での代入を認めていないようです。

となると、この場合「Commandを編集せずに」というのは無理かもしれませんね。


いろいろ調べていただき、結論としてこのようなことまで導き出していただきまして本当にありがとうございます。

ADO.NETというよりはSQL Serverの仕様によってこのような問題がおき、解決するためには素直に「Commandを編集」するということがわかり、これからの機会に大いに役に立つと思います。

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