- PR -

ODPを使用してキーなしテーブルを更新する方法について質問

1
投稿者投稿内容
うぃっしゅ
会議室デビュー日: 2003/12/17
投稿数: 3
投稿日時: 2003-12-17 15:07
環境は、
VB.NET
Oracle9i
接続はODPを使用しています。

OracleのDBにキー設定の無いテーブルを作成し
DataTableクラスを使用してレコードを取得し
項目の内容を更新して
”OracleBuilder.GetUpdateCommand”を実行すると
”Dynamic SQLの生成に失敗しました。キー情報が見つかりません”
とエラーになります。

当然、テーブルにキーの設定を行っていないので怒られる訳ですが
DataTableクラスのヘルプにて”PrimaryKey”の設定が出来ると
記述があったのでPrimaryKeyを設定して実行しましたが同じ結果となりました。

同じテーブル構造でキーを付けたテーブルを作成して
実行した場合とPrimaryKeyの内容を比較してみたのですが
キーあり、キーなしの両方とも{Length=0}との表示がされていて
PrimaryKeyは更新時のキーとして使用されていないのではないかと考えています

SQL上でRowIDを付加して実行した場合は
キーなしでも更新可能でしたが
DataTableの他の部分にキーの設定を行えば
キーなしで作成したテーブルへの更新が
可能なのかご存知の方がいらっしゃったら
実現方法をご教授願います

テーブル構造は
テーブル名 test
test1 varchar2
test2 number
test2 varchar2
です

Imports Oracle.DataAccess
Public p_odpConn As New Oracle.DataAccess.Client.OracleConnection


Dim aaa_adapter As Client.OracleDataAdapter
Dim aaa_table As DataTable
Dim OracleBuilder As Client.OracleCommandBuilder
Dim strSQL As String
Dim i As Integer
Dim keys(0) As DataColumn

Try
strSQL = "select * from test"
'RowIDを付加すると更新ができました
'strSQL = "select *,RowID from test"

aaa_adapter = New Client.OracleDataAdapter(strSQL, p_odpConn)
aaa_table = New DataTable
aaa_adapter.Fill(aaa_table)
OracleBuilder = New Client.OracleCommandBuilder(aaa_adapter)
aaa_adapter.UpdateCommand = New Oracle.DataAccess.Client.OracleCommand
keys(0) = aaa_table.Columns("test1")
aaa_table.PrimaryKey = keys

For i = 0 To aaa_table.Rows.Count - 1
aaa_table.Rows(i).Item("test1") =
CStr(CInt(aaa_table.Rows(i).Item("test1")) + 1)
aaa_table.Rows(i).Item("test2") =
aaa_table.Rows(i).Item("test2") + 1
aaa_table.Rows(i).Item("test3") =
CStr(CInt(aaa_table.Rows(i).Item("test3")) + 1)
Next

aaa_adapter.UpdateCommand = OracleBuilder.GetUpdateCommand
aaa_adapter.Update(aaa_table)

Catch
MsgBox(ErrorToString())
Debug.Write(Err.Description)
End Try
aaa_adapter.Dispose()

長文、乱文で申し訳ございません
1

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