Skip to main content

OleDbParameterはSQLの順番どおりにしないとダメ。

今日ハマったこと。
VB.NET 2008でDBへの更新SQLを書いたのだけど、なんでかAffectedRowが0。つまり更新されない。

SQLは↓こんな感じ。

UPDATE table1 SET
name = @p_name,
memo = @p_memo
WHERE
id = @p_id

で、OleDbCommandにOleDbParameterをセットしていた行が↓こんな感じ。

oCmd = conn.CreateCommand()
:   :
oCmd.Parameters.Add( New OleDbParameter("@p_id",Me.ID) )
oCmd.Parameters.Add( New OleDbParameter("@p_name",Me.Name) )
oCmd.Parameters.Add( New OleDbParameter("@p_memo",Me.Memo) )
:   :
oCmd.ExecuteNonQuery()

こう書いたらうまくUpdateできませんでした。
原因はタイトルの通り、SQLの順番通りにOleDbParameterをAddしないとダメだということ。

つまり

oCmd.Parameters.Add( New OleDbParameter("@p_id",Me.ID) )
oCmd.Parameters.Add( New OleDbParameter("@p_name",Me.Name) )
oCmd.Parameters.Add( New OleDbParameter("@p_memo",Me.Memo) )
oCmd.Parameters.Add( New OleDbParameter("@p_id",Me.ID) )

こうしないとダメだったようで。
じゃあOleDbParameterのコンストラクタの1番目の引数は一体なんの意味があるんだろうか・・。

2009.07.24. 23:33 追記
AffectedRowsが0じゃなくてException吐いたのかもしれないです。
確か「条件式のデータ型が合わない為、抽出できません」とか、そんな感じの例外(失念)。
抽出というキーワードに反応しすぎてWHERE句の部分だけ何度も調べたりいじったり(いじりようがないほどシンプルなSQLだけど)してて、あんまりはっきり覚えてないです。すんません。

Comments