- - PR -
timestamp列をnullにしてInsert文を実行するには?
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-03-29 11:44
>4)DataAdapterのUpdateメソッドでDB更新
アダプタではなく直接SqlCommandで実行したらどうなります? (SqlConnectionTestはアダプタで使用しているSqlConnectionオブジェクトに 差し替えてください。)
| ||||
|
投稿日時: 2004-03-29 12:12
Jittaさんが言われている「ユーザは変更できない」は
Books Onlineを読んだことで理解したつもりです。
私はDataSetを使っている場合には AutoIncrementになっている列でも同じ発想をするときがあるのですが、 DBが勝手に挿入してくれるので「あえてnullを入れて、または空のまま」にすることがあります。 ※単にデザイナで作ったSqlCommandとDataSetを編集するのが面倒というだけなのですが。 ゆうじゅんさんに示して頂いたコードですが、問題なく実行されました。 勝手な想像ですが、DataSetから値を取得するときに今回の問題があるように感じます。 「今回の」問題があるのではないかとわかってきました。 あえて「今回の」としたのは、Jittaさんにご指摘いただいているとおり、 timestamp列をnullにしてInsertをかけるような使われ方は 想定外なのではないかと思ってきたからです。 | ||||
|
投稿日時: 2004-03-29 13:11
>ゆうじゅんさんに示して頂いたコードですが、問題なく実行されました。
timestamp列に「NULL」を入れたいのではなく 「NULL」を送ってtimestampを挿入したいということですか? | ||||
|
投稿日時: 2004-03-29 13:21
timestampにユーザが値を設定できる/できないが「問題」なのではなく、「なぜ、他のツールでは“通る”ことがDataSetでは“通らない”のか」という「疑問」ですね??? DataSetからテーブルを抜き出して、そのテーブルの該当カラムのReadOnlyプロパティを見てみてください。Trueになっていませんか? #デバッガで、クイックビューアを出して、 #DataSet.Tables(?).Columns(?).ReadOnly #を、入力 | ||||
|
投稿日時: 2004-03-29 13:48
Kazさん、Jittaさん、
いろいろお骨折りいただきながらも紛らわしい内容でまことに申し訳ありません。 お二人が言われているように 他の手段ではNullを送ってもちゃんとtimestamp列に値が入るのに なんでDataSetを使ったときだけ、これができないのか?という疑問です。
該当カラムのReadOnlyプロパティは「true」になっていました。 試しにこれを「false」にし、 該当カラムには「何もデータを入れない」「Set<Column名>Nullメソッドを使用」の両方の場合で DataAdapterのUpdateメソッドを呼びましたが症状は同じでした。 | ||||
|
投稿日時: 2004-03-29 14:11
あ、いや、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) と、間違って書いたとすると、他のツールの方は通ってしまいます。そして、データを読み出す段になって「間違っている」ことに気がつくわけですが、「読み込み」を間違えたのか、「書き込み」を間違えたのか、そこから調べなければなりません。 しかし、書き込むときにエラーになっていれば、少なくとも「後から間違いに気づく」より、格段に少ない工数で修正ができます。そういうことだと思います。 | ||||
|
投稿日時: 2004-03-29 14:33
いろいろありがとうございます。
>ちなみに、AllowDBNullはfalseになっていませんか? これはTrueに設定されていました。 Jittaさんが上で書かれている 例えば・・・ からの例が なんで通ってしまうのか?というのが実はよくわからないのですが、 timestamp列は必ずテーブルの最後にくるということですか? >まぁ、「データベースで設定できない値を設定しようとしていることを知らせてくれる」と考えましょうよ。 これについては反論の余地もないどころかまさにそのとおりだと思ってます。 DataSetはメモリ上に展開されたデータベースだと思っているので、 DBにできない(またはやらないほうがいい)ことをすべきではないのはごもっともです。 今回の一件はそもそも、デザイナでDataAdapterから作成されるSqlCommand達を編集せずに パフォーマンス云々は抜きにしてどこまでできるかということに始まっているのですが、 素直にInsert/Update文を書き直すのがセオリーでそうするべきなんでしょうね。 | ||||
|
投稿日時: 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 ] |