- PR -

[ASP.NET ADO.NET]パラメータクエリでの更新について

投稿者投稿内容
Qoo
会議室デビュー日: 2005/12/01
投稿数: 4
投稿日時: 2005-12-01 11:09
OS:Windows2000
Server:SQLServer7.0

初めて投稿いたします。
.NET暦2週間で、ただいま開発に向け勉強中なのですが、
更新の部分で行き詰まっています。
パラメータクエリを書籍等を参考にしながら作成し、さらに
同時実行制御を行うため、DBにtimestamp列を設けましたが、
使用法がよくわかりません。


Dim DA As SqlDataAdapter
Dim sSQL As String
Dim CN As SqlConnection = New SqlConnection("server=XXXXX;database=XXXXX;Trusted_Connection=no;UserID=XXXXX;password=XXXXX;")

Dim DS As New DataSet
CN.Open()
sSQL = "SELECT * FROM MSTTBL"
DA = New SqlDataAdapter(sSQL, CN)
DA.Fill(DS, "MSTTBL")
DS.Tables("MSTTBL").PrimaryKey = New DataColumn() {DS.Tables("MSTTBL").Columns("CODE")}
CN.Close()

sSQL = sSQL & " UPDATE MSTTBL"
sSQL = sSQL & " SET CODE=@CODE_New, KANA=@KANA_New, NAME=@NAME_New, JYUSYO=@JYUSYO_New,TEL=@TEL_New"
sSQL = sSQL & " WHERE CODE=@CODE_Org;"
sSQL = sSQL & " SELECT TIMESTAMPCol FROM MSTTBL WHERE CODE = @CODE_Refresh"

Dim cmd As New SqlCommand(sSQL, CN)
Dim pc As SqlParameterCollection = cmd.Parameters
pc.Add("@CODE_New", SqlDbType.Char, 4, "CODE")
pc.Add("@KANA_New", SqlDbType.Char, 20, "KANA")
pc.Add("@NAME_New", SqlDbType.Char, 30, "NAME")
pc.Add("@JYUSYO_New", SqlDbType.Char, 30, "JYUSYO")
pc.Add("@TEL_New", SqlDbType.Char, 15, "TEL")

Dim param As SqlParameter
param = pc.Add("CODE_Org", SqlDbType.Char, 4, "CODE")
param.SourceVersion = DataRowVersion.Original

pc.Add("@CODE_Refresh", SqlDbType.Char, 4, "CODE")
cmd.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord

DA.UpdateCommand = cmd


'DATATABLEの値を変更
Dim row As DataRow
Dim TBL As DataTable = DS.Tables("MSTTBL")

row = TBL.Rows.Find(txtCD.Text)
If row Is Nothing Then
Else
row.BeginEdit()
End If

row("KANA") = txtKana.Text
row("NAME") = txtName.Text
row("JYUSYO") = txtJyusyo.Text
row("TEL") = txtTel.Text
row.EndEdit()


DA.Update(TBL)


『'CODE_Org' の近くに無効な構文があります。変数 '@CODE_Org' を宣言する必要があります。変数 '@CODE_Refresh' を宣言する必要があります。』というエラーが出ます。

・更新は、WHERE句に主キー列(CODE)とtimestap列のみで判断する(実際は列数が多いため)
・更新後、更新したデータのtimestamp列を取得し直す、
ということがしたいのですが、調べてみましたがわかりませんでした。
RowUpdateイベントを利用して更新後のデータを取得する方法というのが書籍に載って
いましたが、パフォーマンスがよくないとのことでした。
初歩的な質問かと思いますが、どなたかご教授よろしくお願いいたします。

lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2005-12-01 11:59
引用:

『'CODE_Org' の近くに無効な構文があります。変数 '@CODE_Org' を宣言する必要があります。変数 '@CODE_Refresh' を宣言する必要があります。』というエラーが出ます。



 とりあえず'@'が抜けてるようです:

param = pc.Add("CODE_Org", SqlDbType.Char, 4, "CODE")

param = pc.Add("@CODE_Org", SqlDbType.Char, 4, "CODE")
たつ64
会議室デビュー日: 2005/08/02
投稿数: 16
お住まい・勤務地: 天下の台所?
投稿日時: 2005-12-01 13:15
引用:

sSQL = sSQL & " WHERE CODE=@CODE_Org;"
sSQL = sSQL & " SELECT TIMESTAMPCol FROM MSTTBL WHERE CODE = @CODE_Refresh"



とりあえず、セミコロン「;」があるので1SQLになってないです。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2005-12-01 13:22
引用:

たつ64さんの書き込み (2005-12-01 13:15) より:
とりあえず、セミコロン「;」があるので1SQLになってないです。


いや、これは合ってるんだと思いますよ。
たつ64
会議室デビュー日: 2005/08/02
投稿数: 16
お住まい・勤務地: 天下の台所?
投稿日時: 2005-12-01 15:18
あ!
引用:

・更新は、WHERE句に主キー列(CODE)とtimestap列のみで判断する(実際は列数が多いため)
・更新後、更新したデータのtimestamp列を取得し直す、
ということがしたいのですが、調べてみましたがわかりませんでした。


ということなんですね。
よく読んでなかったです。ごめんなさい。
#単に更新するだけと思ってました…。

Qoo
会議室デビュー日: 2005/12/01
投稿数: 4
投稿日時: 2005-12-01 17:07
ご指摘ありがとうございます。@が抜けており、@をつけてみると
エラーは出なくなりました。>lalupin4さま

が、内容が更新されませんでした。

sSQL = sSQL & " WHERE CODE=@CODE_Org;"
の部分を
sSQL = sSQL & " WHERE CODE=@CODE_Org"
sSQL = sSQL & " AND TIMESTAMPCol=@TIMESTAMPCol_Org;"
とし、

param = pc.Add("CODE_Org", SqlDbType.Char, 4, "CODE")
param.SourceVersion = DataRowVersion.Original
の後ろに
param = pc.Add("TIMESTAMPCol_Org", SqlDbType.Binary, 0, "TIMESTAMPCol")
param.SourceVersion = DataRowVersion.Original
としてみたのですが。。。

また、書籍を参考に記述した下記コードについて
実際どういったことが行われて(起こって)いるのか、お教えいただけませんでしょうか?
pc.Add("@CODE_Refresh", SqlDbType.Char, 4, "CODE")
cmd.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord
ヘルプでは少しわかりづらかったです。

よろしくお願いいたします。
lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2005-12-01 21:37
 説明する順番が難しいな。ちょっと待っててね。
lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2005-12-01 22:10
 まずは前提を確認しましょう。
1. DataTableは最初のSelect文の結果を保持します。

2. これら
引用:

pc.Add("@CODE_New", SqlDbType.Char, 4, "CODE")

引用:

param = pc.Add("CODE_Org", SqlDbType.Char, 4, "CODE")
param.SourceVersion = DataRowVersion.Original

引用:

pc.Add("@CODE_Refresh", SqlDbType.Char, 4, "CODE")
cmd.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord


SqlParameter.Add()第4引数を見るに、すべて
DataTable内の同じ列(CODE列)を示します。

 これらはいずれも新しい値が割り当てられていません。

3. よって
引用:

内容が更新されませんでした。


というのは当然の帰結です。厳密には同じ行の同じ列を同じ値で更新されていると考えられます。

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