[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 メーリングリストの案内