[pgsql-jp: 38108] search_pathを変更するとOdbcCommandBuilder でエラー

Reinin Oyama lenin @ hasiru.net
2007年 3月 1日 (木) 18:00:12 JST


大山でございます。
最近、Visual Studio 2005 で、System.Data.Odbcを利用して、アプリを開発し
ています。
そこで、奇妙な現象に出くわしたので、問題提起します。
odbc ドライバは、07 03 0200から最新版まで現象が同じですので、MicroSoft
の不具合かもしれません。
添付のプログラムを実行すると、
UpdateCommand の動的 SQL 生成は、キーである列情報を返さない
SelectCommand に対してはサポートされていません。
というエラーになってしまいます。
テーブル2個には、何れも正しく主キーが設定されています。
また、コメントになっている。
conn.Close()
conn.Open()
を、外して実行すると、正常に動作します。
つまり、いったんあるスキーマをカレントにして UpdateCommand を生成させると、
接続を切るまで、別のスキーマでは、 UpdateCommand は、生成できない。
という現象です。
何か、原因らしきものは、分からないでしょうか?

Imports System.Data.Odbc
Imports System.Data.Odbc.OdbcType

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim conn As New OdbcConnection
        Try
            Dim dat1 As New DataSet
            conn.ConnectionString = "dsn=PostgreSQLyosan;DATABASE=yosandb;UID=yosan;PWD=pass"
            conn.Open()
            Dim com1 As New OdbcCommand
            com1.Connection = conn
            com1.CommandText = "SET search_path TO yosan2007"
            com1.ExecuteNonQuery()
            com1.CommandText = "SELECT * FROM houjin_master"
            Dim ad1 As New OdbcDataAdapter
            ad1.SelectCommand = com1
            ad1.Fill(dat1, "houjin_master")
            Dim cb1 As New OdbcCommandBuilder(ad1)
            With dat1.Tables("houjin_master").Rows(0)
                .BeginEdit()
                .Item("name") = "走るプログラマー"
                .EndEdit()
            End With
            Dim xx1 As DataSet = dat1.GetChanges
            If Not xx1 Is Nothing Then
                ad1.Update(xx1, "houjin_master")
            End If
            dat1.Merge(xx1)
            dat1.AcceptChanges()
            xx1.Dispose()
            'conn.Close()
            'conn.Open()
            Dim dat2 As New DataSet
            Dim com2 As New OdbcCommand
            com2.Connection = conn
            com2.CommandText = "SET search_path TO public"
            com2.ExecuteNonQuery()
            com2.CommandText = "SELECT * FROM version_table"
            Dim ad2 As New OdbcDataAdapter
            ad2.SelectCommand = com2
            ad2.Fill(dat2, "version_table")
            Dim cb2 As New OdbcCommandBuilder(ad2)
            With dat2.Tables("version_table").Rows(0)
                .BeginEdit()
                .Item("version") = "3"
                .EndEdit()
            End With
            Dim xx2 As DataSet = dat2.GetChanges
            If Not xx2 Is Nothing Then
                ad2.Update(xx2, "version_table")
            End If
            dat2.Merge(xx2)
            dat2.AcceptChanges()
            xx2.Dispose()
            conn.Close()
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical)
        End Try
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Me.Close()
    End Sub
End Class






pgsql-jp メーリングリストの案内