none
DataAdapterのSelectCommandエラーについて RRS feed

  • 質問

  • 毎回で心苦しいのですが、1日目は正常に処理されますが2回目になると
    「DataAdapter.SelectCommand プロパティを初期化する必要があります」とでます。
    HelpではFillやSQLのJOINの確認が記載されてましたがJOINはないし、Fillを行っても同じでした。DataAdapterを別定義しているのはGridとの表示をしながら更新・表示をしている関係です。何か根本的に間違っているのでしょうか。

    <Loadイベントにて>
    With npgDataAdapter
     .SelectCommand = New NpgsqlCommand()
        With .SelectCommand
      .CommandText = CommandType.Text
            .CommandText = strSelectSQL
            .Connection = Cnn
     End With
    End With
    npgDataSet.Tables.Clear()
    npgDataAdapter.Fill(npgDataSet, "T_Zip")

    <Editプロシージャにて>
    Using npgBuilder As Npgsql.NpgsqlCommandBuilder = New Npgsql.NpgsqlCommandBuilder(npgDataAdapter)
     If Cnn.State = ConnectionState.Closed Then
      Cnn.Open()
        End If
     Using npgTrans As NpgsqlTransaction = Cnn.BeginTransaction(IsolationLevel.Serializable)
      Try
       Dim tempRow = npgDataSet.Tables("T_Zip").Select("ZipCode=123-0000" )

                tempRow(0).BeginEdit()
                tempRow(0).Item("ZipCode") = "123-0001"
                tempRow(0).Item("Address") = "TEST"
                tempRow(0).EndEdit()

                npgBuilder.GetUpdateCommand.Connection = Cnn
                npgBuilder.GetUpdateCommand.Transaction = npgTrans

                npgDataAdapter.Update(npgDataSet.Tables("T_Zip")) <--ここ

                npgTrans.Commit()
                Catch
        :
                Finally

       If Not npgTrans.Connection Is Nothing Then
        npgTrans.Rollback()
                End If
                If Not (Cnn.State = ConnectionState.Closed) Then
                    Cnn.Close()
                End If
      End Try
     End Using
    End Using

    2010年10月18日 8:20

回答

  • 想像ですが、これも前回と同じではないでしょうか? CommandBuilderはSQLのUpdate文などを生成するために、SelectCommandを実行し、必要な情報をデーターベースから取り込みます。その際、コネクションが閉じていれば取得できず、DataAdapterのUpdateCommandが空白になるのではないでしょうか?

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年10月18日 10:09
    モデレータ
  • 本題からはずれますが、NpgsqlConnection インスタンスをメンバフィールドに保持して Open-Close を繰り返すのではなく、SQL を発行するときに毎回 NpgsqlConnection を作成した方がいいと思います。そうすれば、コネクションが閉じているからトランザクションやコマンドを実行できない、という問題は自然と回避できます。
    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年10月18日 10:46

すべての返信

  • 想像ですが、これも前回と同じではないでしょうか? CommandBuilderはSQLのUpdate文などを生成するために、SelectCommandを実行し、必要な情報をデーターベースから取り込みます。その際、コネクションが閉じていれば取得できず、DataAdapterのUpdateCommandが空白になるのではないでしょうか?

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年10月18日 10:09
    モデレータ
  • 本題からはずれますが、NpgsqlConnection インスタンスをメンバフィールドに保持して Open-Close を繰り返すのではなく、SQL を発行するときに毎回 NpgsqlConnection を作成した方がいいと思います。そうすれば、コネクションが閉じているからトランザクションやコマンドを実行できない、という問題は自然と回避できます。
    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年10月18日 10:46
  • なるほど。確かにCommandBuilderは閉じているようです。

    なかむらさんがおっしゃるように、個別にした方が問題はなさそうです。

    今まで一覧表から修正行を特定・編集するとの考えでやってましたが、入力画面から一覧表を表示させる方法に変えることにより実現できると思います。

    VB6では当たり前にできたことが、初心者のためか解決できませんでした。

    本当にいいアドバイスをいただいたと思います。感謝に耐えません。ありがとうございます。

    2010年10月18日 12:04