はじめまして。
ASP.NETで開発をしていますが、DataAdapterとDataSetを使って
ボタンをトリガにして自分のOracleから別マシンのOracleにデータを
コピーしようと考えています。
双方のテーブル構造は同じにしていますがどうも上手くいきません。
エラーメッセージを出してみると、
「値をNULLにすることはできません。パラメータ名:DataSet」
といったメッセージが出ます。
DaOra.Fill(DsOra, strTableName)
DTOra = DsOra.Tables(strTableName)
DaSQL.Fill(DsSQL, strTableName)
DTSQL = DsSQL.Tables(strTableName)
For i = 0 To DTOra.Rows.Count - 1
DTSQL.ImportRow(DTOra.Rows(i))
Next
DaSQL.Update(DsSQL.GetChanges, strTableName)
ご存知の方ご教授よろしくお願いします。
オラクルはデータを表示させたことしかありませんが、
>「値をNULLにすることはできません。パラメータ名:DataSet」
これはデータベース側のエラーじゃないですか?
エラーメッセージのままですが、NULLを設定できないフィールド
(主キーとかNULL入力不可設定のもの)にNULLを設定するような
処理になってるんじゃないですか?コピー元のデータベースの
データからNULLを無くしてみたらどうです?
あれ?
DataAdapter で Update する時って UpdateCommand
発行しなくて大丈夫なんです?[ASP.NET]はやって
ないんですが、[VB.NET]では必要ですが。
http://www.atmarkit.co.jp/fdotnet/basics/adonet_index/index.html
特攻隊長まるるうさん、回答ありがとうございました。
プログラムではどうにもならなそうだったので、DBLINKを貼って実行することに
しましたが、今度はOracleエラーに阻まれてしまいました。
以下のコードを実行すると、「ExecuteNonQuery」の部分で
「ORA-02041:クライアントデータベースはトランザクションを開始しませんでした」とのエラーが
表示されます。
ちなみに、SQL*Plusで実行した場合は正常に終了します。
以下コード
↓
Dim connStr As New String 自分のDBへの接続情報
Dim conn As New OracleConnection(connStr)
Dim cmd As OracleCommand = conn.CreateCommand()
Dim Trans As OracleTransaction
conn.Open()
Trans = conn.BeginTransaction
cmd.Transaction = Trans
cmd.CommandText = "insert into 自分のTbl
(select * from 相手Tbl@データベースリンク名 where 条件"
cmd.ExecuteNonQuery()←ここでエラー
Trans.Commit()
conn.Close()
解る方がいましたらご教授お願いします
>プログラムではどうにもならなそうだったので
そんなことはないと思いますが…。実際、ボクは
SQL Server で DataAdapter を使い Update する
システムを作りました。SELECT 文のみ設定して
UpdateCommand は自動生成しました(ただし、
全て[VB.NET]の環境であり、まだ試験中ですが…)
>「ORA-02041:クライアントデータベースはトランザクションを開始しませんでした」とのエラーが
環境がないので詳しい調査ができないんですが、
とりあえず、問題の所在をハッキリさせる為に
トランザクション処理をしないで UPDATE して
みるとか?
DataAdapterをOracleからOLEに変更して実行したら
うまくいきました。
特攻隊長まるるうさん、色々とありがとうございました。