- PR -

DataGrid更新処理で失敗する

1
投稿者投稿内容
ヒロミッチ
会議室デビュー日: 2004/04/08
投稿数: 16
投稿日時: 2004-04-12 19:38
はずかしながら今度はデータUPDATE処理です。
データベースはOracleです。
更新処理で失敗しています。多分パラーメータの受渡しで失敗していると思っています。

ソースを添付します。

Private Sub DataGrid2_UpdateCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid2.UpdateCommand
Dim myConn As String = ("Provider=MSDAORA.1;Password=***;User ID=***;Data Source=*****")
Dim MyConnection As New OleDb.OleDbConnection(myConn)
Dim MyCommand As OleDb.OleDbCommand = New OleDb.OleDbCommand()
MyCommand.Connection = MyConnection
MyCommand.CommandText = "UPDATE M_COM_BNK_TEST SET " & _
" H_KNJ_NAME = ?" & _
" WHERE HONTEN_CD = ? AND SITEN_CD = ? AND RECORD_DIV = '91'"

MyCommand.Parameters.Add(New OleDb.OleDbParameter("@HONTEN_CD", OleDb.OleDbType.VarChar, 4))
MyCommand.Parameters("@HONTEN_CD").Value = "0010" MyCommand.Parameters.Add(New OleDb.OleDbParameter("@SITEN_CD", OleDb.OleDbType.VarChar, 3))
MyCommand.Parameters("@SITEN_CD").Value = "051"
MyCommand.Parameters.Add(New OleDb.OleDbParameter("@H_KNJ_NAME", OleDb.OleDbType.VarChar, 80))
MyCommand.Parameters("@H_KNJ_NAME").Value = "テスト"

MyConnection.Open()
MyCommand.ExecuteNonQuery()

MyCommand.Connection.Close()
BindGrid()
End Sub
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-04-13 08:50
> 更新処理で失敗しています。多分パラーメータの受渡しで失敗していると思っています。
・ソース上のどこで失敗しているのでしょう?
・失敗していると判断する根拠は?
 または、パラメータの受け渡しで失敗していると判断する根拠は?
・例外が発生しているなら、例外の種類とそのメッセージは?

 この辺を省略すると、解決までよけいな手間と時間がかかります。早く解決したいなら、あなたが困っている状況を的確に不足なく伝えられるようにしてください。

 また、「困っています。ソースはこうです」というのは、多くの場合、仕事を丸投げしているように思われます。あなたの仕事ですから、あなたが責任を持ってやり遂げてください。そのためにも、
・何を調べたのか
・調べたことを、どう理解したのか
・何がわからないのか
などを書くことは、自分の姿勢をアピールする為の要素です。仕事でも、そういうアピールが出来る、出来ないは上司との良好な関係を築く上で重要な要素と思います。そういうことをする、書く(報告する)癖をつけてください。


追加:
 確かにパラメータの追加でミスってます。もう一度MSDNの、該当する項目を読んでみてください。OleDbは「名前付きパラメータ」を使用できません。名前が付けられないなら、どうやって、パラメータと、SQL文上のパラメータ位置を対応させればよいのでしょう?


[ メッセージ編集済み 編集者: Jitta 編集日時 2004-04-13 08:53 ]
ヒロミッチ
会議室デビュー日: 2004/04/08
投稿数: 16
投稿日時: 2004-04-13 14:51
質問事項を的確に伝えるべきでした。すみません。
MSDNを参考にしたのですがやはりうまくUPDATE処理が動いていません。
更新する項目データはセットされています。
cmd.ExecuteNonQueryで更新のカウントしていますが0件になっています。
OleDbは「名前付きパラメータ」を使用できませんと指摘を受けましたがいろいろと調べたのですが解決できませんでした。
現在の状況は更新ボタン押してUpdate処理後Oracleのエラーはでずに更新されないままDataBindしています。


Dim strSQL As String = "UPDATE M_COM_BNK_TEST " & _
" SET H_KNJ_NAME = ?," & _
" H_KAT_NAME = ?" & _
" WHERE HONTEN_CD = ? AND SITEN_CD = ? AND RECORD_DIV = '91'"

Dim strCon As String = ("Provider=MSDAORA.1;Password=updmgr;User ID=upd;Data Source=iwdb00a")
Dim con As New OleDb.OleDbConnection(strCon)
Dim cmd As New OleDb.OleDbCommand(strSQL, con)

Dim KeyHONTEN_CD As String = CType(e.Item.Cells(1).Controls(0), TextBox).Text
Dim KeySITEN_CD As String = CType(e.Item.Cells(2).Controls(0), TextBox).Text
Dim DatH_KNJ_NAME As String = CType(e.Item.Cells(3).Controls(0), TextBox).Text

cmd.Parameters.Add("@HONTEN_CD", OleDb.OleDbType.VarWChar, 4).Value = KeyHONTEN_CD
cmd.Parameters.Add("@SITEN_CD", OleDb.OleDbType.VarWChar, 3).Value = KeySITEN_CD
cmd.Parameters.Add("@H_KNJ_NAME", OleDb.OleDbType.VarWChar, 80).Value = DatH_KNJ_NAME

     con.Open()
Dim cnt As Integer = cmd.ExecuteNonQuery()
con.Close()
    
     DataGrid2.EditItemIndex = -1
BindGrid()

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-04-13 16:51
引用:

ヒロミッチさんの書き込み (2004-04-13 14:51) より:

OleDbは「名前付きパラメータ」を使用できませんと指摘を受けましたがいろいろと調べたのですが解決できませんでした。
現在の状況は更新ボタン押してUpdate処理後Oracleのエラーはでずに更新されないままDataBindしています。


 だから、追加で『どうやって、パラメータと、SQL文上のパラメータ位置を対応させればよいのでしょう?』と書いたのですが。。。

 マニュアルの、「解説」の部分を、よく読んでみてください。こんなことが書いてありませんか?
引用:

コマンド テキストでのパラメータの疑問符プレースホルダの位置と、 OleDbParameter オブジェクトを OleDbParameterCollection に追加する順序とを、正しく対応させる必要があります。



 この文が理解できたら、ソースを見直しましょう。

コード:
Dim strSQL As String = "UPDATE M_COM_BNK_TEST " & _ 
" SET H_KNJ_NAME = ?," & _ 
" H_KAT_NAME = ?" & _ 
" WHERE HONTEN_CD = ?" & _
" AND SITEN_CD = ?" _
" AND RECORD_DIV = '91'"

cmd.Parameters.Add("@HONTEN_CD", OleDb.OleDbType.VarWChar, 4)
cmd.Parameters.Add("@SITEN_CD", OleDb.OleDbType.VarWChar, 3)
cmd.Parameters.Add("@H_KNJ_NAME", OleDb.OleDbType.VarWChar, 80)


あれ?個数があってない???実行できているということなので、転記ミスと判断して、順番はどうなっていますか?



 なお、.NET Framework Ver.1.1以降なら、System.Data.OracleClient名前空間の下のクラスを使えば、プレースホルダに名前を使用できます。対応しているOracleのバージョンに要注意ですが。
ヒロミッチ
会議室デビュー日: 2004/04/08
投稿数: 16
投稿日時: 2004-04-13 17:19
解決しました。SQLに対応するパラメータの順序設定ミスでした。
パラメータの数に違いは貼り付けソースを簡略化したもので実ソースはあっています。
基本技術がない為にご迷惑かけました。
1

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