C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[13]: SqlCommandBuilderによるデータ更新について


(過去ログ 54 を表示中)

[トピック内 28 記事 (1 - 20 表示)]  << 0 | 1 >>

■29818 / inTopicNo.1)  SqlCommandBuilderによるデータ更新について
  
□投稿者/ KEI (1回)-(2008/12/15(Mon) 16:11:13)

分類:[.NET 全般] 

開発環境:XPPro
使用言語:VS.NET 2003

お世話になります。

SQLServer2000のデータベースに、[顧客]というテーブルがあります。
あるフォームにある[更新]ボタン(btnKosin)をクリックすると、
そのテーブルにおいて、[性別](nvarchar型)が「男」であるレコードの[F](tinyint型)というフィールドの値を、「1」に更新したいと考えています。
このテーブルへの接続文字列を変数pbstrSetuzokuに格納しています。

以下のコードを実行するのですが、For〜Nextのループが2回目のループでエラーになり、更新ができません。どなたかお分かりになる方がいらっしゃいましたら、ご教示お願いします。
(コード開始)***************************************************************
Private Sub btnKosin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnKosin.Click
Dim i As Integer
Dim strSQL As String
Dim cn As SqlClient.SqlConnection
    Dim da As SqlClient.SqlDataAdapter
Dim dt As DataTable
Dim ds As New DataSet
Dim dr As DataRow()
Dim scb As SqlClient.SqlCommandBuilder

i = 0

Try
  strSQL = "SELECT [性別],[F] FROM [顧客]"
cn = New SqlClient.SqlConnection(pbstrSetuzoku)
      da = New SqlClient.SqlDataAdapter(strSQL, cn)
da.Fill(ds, "顧客")
dt = ds.Tables("顧客")
dr = dt.Select("[性別]='男'")

If dr.Length > 0 Then
For i = 0 To dr.Length - 1
dr(i).BeginEdit()
dr(i)("F") = 1
scb = New SqlClient.SqlCommandBuilder(da)
da.Update(ds, "顧客")
Next
MsgBox("更新しました。")
Else
Exit Sub
End If
Catch ex As Exception
      (例外処理の記述)
End Try
End Sub
(コードの終了)***************************************************************

以上、よろしくお願いいたします。

引用返信 編集キー/
■29819 / inTopicNo.2)  Re[1]: SqlCommandBuilderによるデータ更新について
□投稿者/ Jitta (556回)-(2008/12/15(Mon) 16:24:20)
No29818 (KEI さん) に返信

 せめて、どんな SQL 文が作られているかは、確認して使いましょう。
また、「エラーになり、更新ができません。」ではなく、どんなエラーが出たのでしょう?同時実行違反?

 それより、「UPDATE [顧客] SET [F]=1 WHERE [性別]='男'」 ではだめなのでしょうか?
# UPDATE 文ってこれでいいんだっけ?
引用返信 編集キー/
■29822 / inTopicNo.3)  Re[2]: SqlCommandBuilderによるデータ更新について
□投稿者/ やじゅ (860回)-(2008/12/15(Mon) 16:32:38)
やじゅ さんの Web サイト
> ■No29818 (KEI さん) に返信
>

SqlCommandBuilderをForの上に移動してみるとどうでしょう?

scb = New SqlClient.SqlCommandBuilder(da)
For i = 0 To dr.Length - 1
dr(i).BeginEdit()
dr(i)("F") = 1
da.Update(ds, "顧客")
Next

引用返信 編集キー/
■29832 / inTopicNo.4)  Re[2]: SqlCommandBuilderによるデータ更新について
□投稿者/ KEI (2回)-(2008/12/15(Mon) 17:34:20)
No29819 (Jitta さん) に返信
> ■No29818 (KEI さん) に返信
>
>  せめて、どんな SQL 文が作られているかは、確認して使いましょう。
> また、「エラーになり、更新ができません。」ではなく、どんなエラーが出たのでしょう?同時実行違反?
>
>  それより、「UPDATE [顧客] SET [F]=1 WHERE [性別]='男'」 ではだめなのでしょうか?
> # UPDATE 文ってこれでいいんだっけ?

ご指導ありがとうございます。
説明不足で申し訳ございません。
エラー内容は「UpdateCommandの動的SQL生成は、キーである列情報を返さないSelectCommandに対してサポートされていません」というものでした。
UPDATE文については、諸々の事情により、UPDATE文を使わないで更新を行う方法を探しております。
引用返信 編集キー/
■29833 / inTopicNo.5)  Re[3]: SqlCommandBuilderによるデータ更新について
□投稿者/ KEI (3回)-(2008/12/15(Mon) 17:35:34)
No29822 (やじゅ さん) に返信
>>■No29818 (KEI さん) に返信
>>
>
> SqlCommandBuilderをForの上に移動してみるとどうでしょう?
>
> scb = New SqlClient.SqlCommandBuilder(da)
> For i = 0 To dr.Length - 1
> dr(i).BeginEdit()
> dr(i)("F") = 1
> da.Update(ds, "顧客")
> Next
>

ご指導ありがとうございます。
SqlCommandBuilderをForの上に移動してみたのですが、うまくいきませんでした。
再度調べてみます。


引用返信 編集キー/
■29834 / inTopicNo.6)  Re[4]: SqlCommandBuilderによるデータ更新について
□投稿者/ KEI (4回)-(2008/12/15(Mon) 17:43:23)
ご指導ありがとうございました。
SELECT文において、[顧客]における主キー列を取得していないことが原因でした。
strSQL = "SELECT [性別],[F] FROM [顧客]"を、
strSQL = "SELECT [顧客C],[性別],[F] FROM [顧客]"([顧客C]=主キー)に変更して、更新することが出来ました。

引用返信 編集キー/
■29858 / inTopicNo.7)  Re[5]: SqlCommandBuilderによるデータ更新について
□投稿者/ Jitta (557回)-(2008/12/15(Mon) 23:04:55)
Jitta さんの Web サイト
No29834 (KEI さん) に返信
> ご指導ありがとうございました。
> SELECT文において、[顧客]における主キー列を取得していないことが原因でした。
> strSQL = "SELECT [性別],[F] FROM [顧客]"を、
> strSQL = "SELECT [顧客C],[性別],[F] FROM [顧客]"([顧客C]=主キー)に変更して、更新することが出来ました。
>

それ、UPDATE 文が発行されます、それも変更しなければならない行の数だけ。いいの?
引用返信 編集キー/
■29869 / inTopicNo.8)  Re[3]: SqlCommandBuilderによるデータ更新について
□投稿者/ みきぬ (305回)-(2008/12/16(Tue) 09:37:15)
No29832 (KEI さん) に返信
> UPDATE文については、諸々の事情により、UPDATE文を使わないで更新を行う方法を探しております。

このへん解説希望。
「UPDATE文を使わないで」ってどういう意味?
「諸処の事情」ってどんな事情?
引用返信 編集キー/
■29883 / inTopicNo.9)  Re[4]: SqlCommandBuilderによるデータ更新について
□投稿者/ い (3回)-(2008/12/16(Tue) 11:04:28)
もしかして直接ストレージを書き換えるというソリューションですか!?

引用返信 編集キー/
■29896 / inTopicNo.10)  Re[5]: SqlCommandBuilderによるデータ更新について
□投稿者/ 未記入 (1回)-(2008/12/16(Tue) 12:54:51)
「UPDATE文を使わないで」というのは、UPDATE文を*直接*発行しない、ということじゃない?
最近は、DAOを経由してSQLステートメントを意識させずにデータベースを扱うことはありますよ。
まさか、DAOライブラリが UPDATE文を発行することまで禁止したいわけじゃないでしょうに…。
ストレージ書き換えとかトンデモなこと言う前に、ちょっとは意味を汲んだほうがいいと思いますよ。
引用返信 編集キー/
■29899 / inTopicNo.11)  Re[5]: SqlCommandBuilderによるデータ更新について
□投稿者/ たくボン (101回)-(2008/12/16(Tue) 12:58:16)
No29883 (い さん) に返信
> もしかして直接ストレージを書き換えるというソリューションですか!?

いや、単純に直接「UPDATE文」を作成せずに更新したいんだと思う。
SqlCommandBuilderを使ってもDataAdapter使ってもUPDATE文は作るんだけど、コード上に出てこなければいいって話なんじゃないかな?

#エスパーじゃないので違ってたらすいません。
引用返信 編集キー/
■29903 / inTopicNo.12)  Re[6]: SqlCommandBuilderによるデータ更新について
□投稿者/ みきぬ (308回)-(2008/12/16(Tue) 13:57:23)
[壁]-`)oO(ネタにマジレス…

# 「UPDATE文を直接発行しないで」だと解釈したとして、なぜそうする必要があるの?
# SELECT文はベタで書いてるのに、UPDATE文は直接書きたくないって、おかしくなーい?
引用返信 編集キー/
■29942 / inTopicNo.13)  Re[7]: SqlCommandBuilderによるデータ更新について
□投稿者/ 未記入 (2回)-(2008/12/16(Tue) 20:17:04)
SELECT文をベタで書いている?本当に?私はSELECT文を*ベタ*で書いているようには見えませんけど?
質問者のコードでは男性のデータだけを処理しているけど、そんな Where句は書いてありませんよね。
これはつまり、SELECT文を*ベタ*ではないということ。

SELECT文を一切書かずに済むDAOもありますけどね。そんなDAOでも対象テーブル名と対象列くらいは
なんらかの方法で記述しなくちゃならないんです。それなら「SELECT 列名 FROM テーブル名」は
直接書いたほうが簡単で合理的なんです。処理の起点でもありますしね。

それに対して、UPDATE、DELETE、INSERT を使う場合というのは、多くの場合、
プログラム内で Row オブジェクトとして表現されているのですね。つまり行が特定されているんです。
それなら、そのオブジェクトに対して操作を指示できたほうが楽だとは思いませんか?
SQL文を直接書く場合は、Row オブジェクトからキーとなる値を取り出して、
自分で Where句を表現しなおさなきゃならないんです。Row オブジェクトとして行が特定されているのにですよ?

どうですか? SELECT と他の DML が DAO において位置付けが異なるということが
理解していただけるでしょうか?
引用返信 編集キー/
■29943 / inTopicNo.14)  Re[8]: SqlCommandBuilderによるデータ更新について
□投稿者/ Jitta on the way (246回)-(2008/12/16(Tue) 21:29:38)
No29942 (未記入 さん) に返信
> SELECT文をベタで書いている?本当に?私はSELECT文を*ベタ*で書いているようには見えませんけど?
> 質問者のコードでは男性のデータだけを処理しているけど、そんな Where句は書いてありませんよね。
> これはつまり、SELECT文を*ベタ*ではないということ。
>
> SELECT文を一切書かずに済むDAOもありますけどね。そんなDAOでも対象テーブル名と対象列くらいは
> なんらかの方法で記述しなくちゃならないんです。それなら「SELECT 列名 FROM テーブル名」は
> 直接書いたほうが簡単で合理的なんです。処理の起点でもありますしね。
>
> それに対して、UPDATE、DELETE、INSERT を使う場合というのは、多くの場合、
> プログラム内で Row オブジェクトとして表現されているのですね。つまり行が特定されているんです。
> それなら、そのオブジェクトに対して操作を指示できたほうが楽だとは思いませんか?
> SQL文を直接書く場合は、Row オブジェクトからキーとなる値を取り出して、
> 自分で Where句を表現しなおさなきゃならないんです。Row オブジェクトとして行が特定されているのにですよ?
>
> どうですか? SELECT と他の DML が DAO において位置付けが異なるということが
> 理解していただけるでしょうか?

それもまた、不明瞭だと思っています。
select に where を付けていないので、全件引っ張ってきます。はたして、それは必要なことなのか?ローカルにあるデータを、「更新」ボタンで更新するのではなく、「更新」ボタンで、すべてのデータを処理させている。
全件引っ張ってきて、一件一件確認しながら更新し、一件一件確認しながら書き戻す。
無駄なことをしているように思うのです。全件、ローカルに引っ張ってくる必要があるの?それが聞きた〜い
引用返信 編集キー/
■29961 / inTopicNo.15)  Re[9]: SqlCommandBuilderによるデータ更新について
□投稿者/ 未記入 (3回)-(2008/12/17(Wed) 03:26:10)
>それもまた、不明瞭だと思っています。

「それ」とは何を指していますか? 何に対して不明瞭だと言っていますか?
私は効率の話など一切していませんよ。

パフォーマンスに焦点をあてることで、DAOの優位性を否定することはできるかもしれませんが、
SQLを直接書かずにデータベース操作をおこなうことができる DAO が
*存在するということ*を否定することはできませんよ。言ってること… 分かりますかね?

DAO の存在も知らずに、ストレージ書き換えとか馬鹿な事言ってるんじゃないんですか?
引用返信 編集キー/
■29962 / inTopicNo.16)  Re[10]: SqlCommandBuilderによるデータ更新について
□投稿者/ Jitta on the way (248回)-(2008/12/17(Wed) 07:23:15)
No29961 (未記入 さん) に返信
> >それもまた、不明瞭だと思っています。
>
> 「それ」とは何を指していますか? 何に対して不明瞭だと言っていますか?
> 私は効率の話など一切していませんよ。
>
> パフォーマンスに焦点をあてることで、DAOの優位性を否定することはできるかもしれませんが、
> SQLを直接書かずにデータベース操作をおこなうことができる DAO が
> *存在するということ*を否定することはできませんよ。言ってること… 分かりますかね?
>
> DAO の存在も知らずに、ストレージ書き換えとか馬鹿な事言ってるんじゃないんですか?

KEIさんの上司でしたか!DAOについて教えるための制約だったんですね!それは失礼しました。
引用返信 編集キー/
■29968 / inTopicNo.17)  Re[8]: SqlCommandBuilderによるデータ更新について
□投稿者/ みきぬ (313回)-(2008/12/17(Wed) 10:51:20)
No29942 (未記入 さん) に返信
> どうですか? SELECT と他の DML が DAO において位置付けが異なるということが
> 理解していただけるでしょうか?

うーん、正直なところ半分も理解できなかったのですが、もしかするとそうなのかもしれませんね。
でも、それが質問者のいう「諸般の事情」にあたるとは思えません。
引用返信 編集キー/
■29974 / inTopicNo.18)  Re[10]: SqlCommandBuilderによるデータ更新について
□投稿者/ い (4回)-(2008/12/17(Wed) 11:40:06)
No29961 (未記入 さん) に返信
> DAO の存在も知らずに、ストレージ書き換えとか馬鹿な事言ってるんじゃないんですか?

わぁ〜DAOちょ〜すごーい。ということですね。わかります。

皮肉で、ストレージ書き換えとか馬鹿な事を言ったんですけど、
本気で顔を真っ赤にして反論するとは思っていませんでした。
大変ご迷惑をおかけしました〜☆
引用返信 編集キー/
■29979 / inTopicNo.19)  Re[9]: SqlCommandBuilderによるデータ更新について
□投稿者/ 未記入 (5回)-(2008/12/17(Wed) 12:26:17)
皮肉で馬鹿なことを言った?
皮肉になってないから突っ込んでるわけですが…。
「UPDATE文なしで更新できるわけがない」という前提があれば皮肉にもなりますけどねえ。
実際には「UPDATE文なしで更新できる」ソリューションがあるわけですから。

> KEIさんの上司でしたか!DAOについて教えるための制約だったんですね!それは失礼しました。

いいえ。上司ではありません。で、何が不明瞭なのかは答えてくれないのですか?
引用返信 編集キー/
■30004 / inTopicNo.20)  Re[10]: SqlCommandBuilderによるデータ更新について
 
□投稿者/ も (60回)-(2008/12/17(Wed) 13:49:13)
No29979 (未記入 さん) に返信
もです、後学の為にお教えいただきたいのですが
> 皮肉で馬鹿なことを言った?
> 皮肉になってないから突っ込んでるわけですが…。
> 「UPDATE文なしで更新できるわけがない」という前提があれば皮肉にもなりますけどねえ。
> 実際には「UPDATE文なしで更新できる」ソリューションがあるわけですから。
”UPDATE文なしで更新”とはRDBMSに対してSQLのUPDATE文を一切発行せずに更新できるということでしょうか?
それともプログラミングテクニック的にSQLのUPDATE文を隠蔽して(つまり内部でUPDATE文を使って)更新できるということでしょうか?
解決済み
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -