- PR -

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

投稿者投稿内容
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-03-29 11:44
>4)DataAdapterのUpdateメソッドでDB更新

アダプタではなく直接SqlCommandで実行したらどうなります?

(SqlConnectionTestはアダプタで使用しているSqlConnectionオブジェクトに
差し替えてください。)

コード:
// データベースの接続を開く
SqlConnectionTest.Open();

// SqlCommandオブジェクトを作成
System.Data.SqlClient.SqlCommand testCommand = new System.Data.SqlClient.SqlCommand();

// SQL文を設定
testCommand.CommandText = "insert into Table (ID, Name, Stamp) values (1, 'libaty', (null)) ";

// データベース接続の設定
testCommand.Connection = SqlConnectionTest;

// SQLの実行
try
{
	testCommand.ExecuteNonQuery();
}
catch( System.Exception exp )
{
}
finally
{
	// データベースの接続を閉じる
	SqlConnectionTest.Close();
}

libaty
会議室デビュー日: 2004/03/28
投稿数: 11
投稿日時: 2004-03-29 12:12
Jittaさんが言われている「ユーザは変更できない」は
Books Onlineを読んだことで理解したつもりです。
引用:
nullを放り込んだはずなのに、null以外の値が入っていることを、なぜ「おかしい」と思わずに、『ちゃんと入っているのではないか』と考えられたのでしょう?


私はDataSetを使っている場合には
AutoIncrementになっている列でも同じ発想をするときがあるのですが、
DBが勝手に挿入してくれるので「あえてnullを入れて、または空のまま」にすることがあります。
※単にデザイナで作ったSqlCommandとDataSetを編集するのが面倒というだけなのですが。

ゆうじゅんさんに示して頂いたコードですが、問題なく実行されました。
勝手な想像ですが、DataSetから値を取得するときに今回の問題があるように感じます。
「今回の」問題があるのではないかとわかってきました。
あえて「今回の」としたのは、Jittaさんにご指摘いただいているとおり、
timestamp列をnullにしてInsertをかけるような使われ方は
想定外なのではないかと思ってきたからです。
ジエゴ
常連さん
会議室デビュー日: 2003/12/08
投稿数: 26
お住まい・勤務地: ヨコハマ
投稿日時: 2004-03-29 13:11
>ゆうじゅんさんに示して頂いたコードですが、問題なく実行されました。

timestamp列に「NULL」を入れたいのではなく
「NULL」を送ってtimestampを挿入したいということですか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-29 13:21
引用:

libatyさんの書き込み (2004-03-29 12:12) より:

勝手な想像ですが、DataSetから値を取得するときに今回の問題があるように感じます。
「今回の」問題があるのではないかとわかってきました。


 timestampにユーザが値を設定できる/できないが「問題」なのではなく、「なぜ、他のツールでは“通る”ことがDataSetでは“通らない”のか」という「疑問」ですね???

 DataSetからテーブルを抜き出して、そのテーブルの該当カラムのReadOnlyプロパティを見てみてください。Trueになっていませんか?
#デバッガで、クイックビューアを出して、
#DataSet.Tables(?).Columns(?).ReadOnly
#を、入力
libaty
会議室デビュー日: 2004/03/28
投稿数: 11
投稿日時: 2004-03-29 13:48
Kazさん、Jittaさん、
いろいろお骨折りいただきながらも紛らわしい内容でまことに申し訳ありません。

お二人が言われているように
他の手段ではNullを送ってもちゃんとtimestamp列に値が入るのに
なんでDataSetを使ったときだけ、これができないのか?という疑問です。

引用:

Jittaさんの書き込み

DataSetからテーブルを抜き出して、そのテーブルの該当カラムのReadOnlyプロパティを見てみてください。Trueになっていませんか?


該当カラムのReadOnlyプロパティは「true」になっていました。
試しにこれを「false」にし、
該当カラムには「何もデータを入れない」「Set<Column名>Nullメソッドを使用」の両方の場合で
DataAdapterのUpdateメソッドを呼びましたが症状は同じでした。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-29 14:11
引用:

libatyさんの書き込み (2004-03-29 13:48) より:

該当カラムのReadOnlyプロパティは「true」になっていました。
試しにこれを「false」にし、
該当カラムには「何もデータを入れない」「Set<Column名>Nullメソッドを使用」の両方の場合で
DataAdapterのUpdateメソッドを呼びましたが症状は同じでした。


 あ、いや、Falseにしたからといって、設定できるようになるわけではありません。これは「データベース側の設定」を引き継いでいると思います。引き継ぐ?設定にあわせる、かな?ちなみに、AllowDBNullはfalseになっていませんか?

 まぁ、「データベースで設定できない値を設定しようとしていることを知らせてくれる」と考えましょうよ。たとえば、
Column1 Integer
Column2 Integer
Column3 TimeStamp
というテーブルを作っていて、これに「Column4 Integer」を追加したとします。
Column1 Integer
Column2 Integer
Column3 TimeStamp
Column4 Integer
このとき、INSERT文を、
INSERT INTO Table1 VALUES (1, 2, 4, null)
と、間違って書いたとすると、他のツールの方は通ってしまいます。そして、データを読み出す段になって「間違っている」ことに気がつくわけですが、「読み込み」を間違えたのか、「書き込み」を間違えたのか、そこから調べなければなりません。
 しかし、書き込むときにエラーになっていれば、少なくとも「後から間違いに気づく」より、格段に少ない工数で修正ができます。そういうことだと思います。
libaty
会議室デビュー日: 2004/03/28
投稿数: 11
投稿日時: 2004-03-29 14:33
いろいろありがとうございます。

>ちなみに、AllowDBNullはfalseになっていませんか?
これはTrueに設定されていました。

Jittaさんが上で書かれている 例えば・・・ からの例が
なんで通ってしまうのか?というのが実はよくわからないのですが、
timestamp列は必ずテーブルの最後にくるということですか?

>まぁ、「データベースで設定できない値を設定しようとしていることを知らせてくれる」と考えましょうよ。
これについては反論の余地もないどころかまさにそのとおりだと思ってます。
DataSetはメモリ上に展開されたデータベースだと思っているので、
DBにできない(またはやらないほうがいい)ことをすべきではないのはごもっともです。

今回の一件はそもそも、デザイナでDataAdapterから作成されるSqlCommand達を編集せずに
パフォーマンス云々は抜きにしてどこまでできるかということに始まっているのですが、
素直にInsert/Update文を書き直すのがセオリーでそうするべきなんでしょうね。
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2004-03-29 15:16
>今回の一件はそもそも、デザイナでDataAdapterから作成されるSqlCommand達を編集せずに
この1文が最初の質問に入っていれば、誤解が少なくてすんだかもしれませんね。
たしかに、自動化して楽できるところは極力したいものです。

ちなにみtimestamp列を含んだ更新ロジックを生成する機能は、CommandBuilderでもデータアダプタ構成ウィザードでもサポートされていないようです。(プログラミングADO.NETという書籍より)

ここにもそれとなくtimestamp型はカスタムコマンドを作成する必要があると書かれていますね。。残念なり;;
http://support.microsoft.com/default.aspx?scid=kb;ja;313483

#これUpdateの話でした。すんません(汗 でも、Insertも同じかな・・・?


[ メッセージ編集済み 編集者: nodera 編集日時 2004-03-29 15:22 ]

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