tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルSqlDataAdapterのUPDATEメソッドについて
記事No490
投稿日: 2003/10/16(Thu) 11:35
投稿者しんじ
[OSのVer]:Windows2000    [VBのVer]:VB.NET

お世話になっております。
ADO.NETとSQLServer2000でDBを構築しているのですが、
更新ロジックを作成し、DATASET内の保留更新をSqlDataAdapterでINSERT処理しています。
INSERTコマンドにはストアドプロシージャーを使用しています。
バッチ自体は正常に動作しているのですが、1件毎に「成功」「失敗」
「データが存在していおりスキップした」
(ExecuteNonQueryメソッドの戻り値を取得するようなイメージです。)
を調べたいのですが方法がわからず悪戦苦闘しております。

SqlDataAdapter.UpdateメソッドにもINTERGER型の戻り値があるのですが、
最終更新時にしか戻ってきません。
下のコードですと「成功」「失敗」は分かりますが、「データが存在しておりスキップした」が分か
りませ
ん。
ヒントだけでも結構ですので御教授頂けます様よろしくお願い致します。

動作サンプルコード;(実際は嫌になるぐらい長いので掲示板用に要所だけ書きました。
この環境にはSQLServerが無いのでTESTしていません。間違っていたらすみません):

'Imports System.Data.SqlClient を宣言

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles Button1.Click

        'メインルーチン
        Dim Cn As SqlConnection = CreateSqlCon _
                        ("UserId", "Password", "Catalog", "Sourse")
        Dim da As New SqlDataAdapter()
        da.InsertCommand = CreateInsertCommand(Cn)
        'da.UpdateCommand = CreateUpdateCommand(Cn)  省略
        'da.DeleteCommand= CreateDeleteCommand(Cn)   省略

        'テスト用データセット作成
        Dim ds As New DataSet()
        Dim tbl As DataTable = ds.Tables.Add("Tbl1")
        Dim row As DataRow : Dim Col As DataColumn
        Col = tbl.Columns.Add("test1")
        Col = tbl.Columns.Add("test2")

        '適当にデータセットにデータを入れる
        Dim i As Integer
        For i = 1 To 100
               row = ds.Tables("Tbl1").NewRow
                  For Each Col In tbl.Columns
                         row(Col) = i
                  Next
               ds.Tables("Tbl1").Rows.Add(row)
        Next

        '更新する
        Dim inttestUpdate As Integer
        inttestUpdate = da.Update(ds, "Tbl1") 'ここのバッチで評価したい
                                               が最終時にしか引数が渡されない
        'ここに評価ルーチンを入れたいがバッチ中にここまで到達しない。
     '現在はFILLエラーイベントでエラーだけ処理しているが、「データが既にある」
     '場合SQLServerはエラーを返さないので評価が出来ない。
    End Sub


    Private Function CreateSqlCon _
        (ByVal strUserID As String, ByVal strPWS As String, _
         ByVal strCtl As String, ByVal strSou As String) As SqlConnection

        'コネクションを作成する
        Dim Cn As New SqlConnection()
        Cn.ConnectionString = _
            "user id=" & strUserID & ";" & _
            "password=" & strPWS & ";" & _
            "Initial Catalog=" & strCtl & ";" & _
            "Data Source=" & strSou & ";"

        Return Cn
    End Function



    Private Function CreateInsertCommand(ByVal Cn As SqlConnection) As SqlCommand

        'インサートコマンドを作成する
        Dim cmdInsert As New SqlCommand("Insert_SutoredProg", Cn)
        Dim PC As SqlParameter
        cmdInsert.CommandType = CommandType.StoredProcedure

        With cmdInsert.Parameters
            PC = .Add("@Test1", SqlDbType.BigInt)
            PC.SourceColumn = "test1"
            PC = .Add("@Test2", SqlDbType.BigInt)
            PC.SourceColumn = "test2"
       'ストアドプロシージャーの戻りパラメーターで評価できるのであればこれが一番希望です。
       'ストアドプロシージャーで Returnで返される値
       '-1:エラー ; 0 成功 1:データが既に存在したなど
            'PC = .Add("@RetVal", SqlDbType.Int)
            'cmdInsert.Parameters("@RetVal").Direction = ParameterDirection.ReturnValue
        End With

        Return cmdInsert
    End Function

[ツリー表示へ]
タイトルRe: SqlDataAdapterのUPDATEメソッドについて
記事No541
投稿日: 2003/11/07(Fri) 15:17
投稿者しんじ
本件DATAADAPTERのイベントを使う事で自己解決致しました^^

[ツリー表示へ]