2009-06-04 10 views
0

Oracleにclobを挿入しようとしています。 OdbcConnectionでこれを試すと、データはデータベースに挿入されません。影響を受けた1行を返しますが、エラーは発生しませんが、データベースには何も挿入されません。ODBCを使用してoracleにclobを挿入する

OracleConnectionで動作します。ただし、Microsoft OracleClientを使用すると、WebサービスでAccessViolationException(保護されたメモリの読み取りまたは書き込みを試みる)がクラッシュすることがあります。これは、多くの場合、他のメモリが破損していることを示しています。これは、OracleDataAdapter.Fill(データセット)を使用すると、多く発生します。だから、これを使うのはオプションのようには見えません。

OdbcConnectionを使用して.NETから4.000文字以上を挿入/更新する方法はありますか?

+0

あなたが使用しているコードを投稿してもらえますか? –

答えて

1

私はしばらくの間、.NETプラットフォームで作業していないので、これはメモリからのものです。

私の知る限り、Oracle用のOdbcConnectionのアダプタは古代であり、一度に4000文字を超える挿入/更新はできません。一度にCLOB 4000文字を転送および更新するストアド・プロシージャを作成できますが、これは高齢化ライブラリをサポートするには困難で非効率的な手段のようです。

したがって、MSのOracleConnectionは、デバッグするためのより良い方法です。 AccessViolationExceptionは、分散トランザクションコントローラ(msdtc.exe)が開始されていないことが原因で最もよく発生しますが、その他の潜在的な原因(ハードウェア障害を含む)が数多くあります。

例外を調べる前に、考慮する3番目の接続ライブラリがあります。 OracleのDataAccessコンポーネント(ODAC ODP.NET)。データベースのライセンスに含まれている必要があります。 OdbcConnectionよりもはるかにサポートされており、OracleConnectionの例外スローを回避する必要があります。

+0

私は今、オラクルODP.NETでそれを試してみましたが、動作しているようです。私が試してみたいと思います任意の例? – Carra

1

これはodbcの問題ではなく、oraclesの部分の制限だと思います。 select文を使用して挿入または更新する場合は、4000文字を超える文字は使用できません。これを行うには、バインド変数とplsqlを使用することをお勧めします。私は、これは非常に醜いソリューションのように音を知っているが、それは私がこれまでに発見したすべてです。(私のテーブルで

http://www.evilcyborg.com/lounge/?ID=1245

+0

ここのリンクは壊れています... – LThode

1

私はブロブに私のCLOBを変え、あなたのテキストをバイトにテーブルブロブに入る転換します。配列。その後、値converyのバイト配列のtoStringを読むとき。

//insert code 
System.Text.Encoding enc = System.Text.Encoding.ASCII; 
byte[] blobByteArray = enc.GetBytes(text); 

string sql = "insert into xxxxx (id,name,script_blob) values (?,?,?)"; 
cmd = new OdbcCommand(sql, conn); 
cmd.CommandTimeout = _cmdtimeout; 
cmd.Parameters.Add("id", OdbcType.VarChar); 
cmd.Parameters["id"].Value = script_id; 
cmd.Parameters.Add("name", OdbcType.VarChar); 
cmd.Parameters["name"].Value = name; 
cmd.Parameters.Add("script_blob", OdbcType.Binary); 
cmd.Parameters["script_blob"].Value = blobByteArray; 
int i = cmd.ExecuteNonQuery(); 

//read blob back from db 
System.Text.Encoding enc = System.Text.Encoding.ASCII; 
string sql = "select id,name,script_blob from bc_script"; 
cmd = new OdbcCommand(sql, conn); 
cmd.CommandTimeout = _cmdtimeout;  
OdbcDataReader dr2 = cmd.ExecuteReader(); 
if (dr2.HasRows) 
{ 
    rtn = new List<BCScript>(); 
    while (dr2.Read()) 
    { 
     string Script_text = enc.GetString((byte[])dr2["script_blob"]); 
    } 
} 

cmd.Dispose(); 
関連する問題