2009-06-04 5 views
0

Ich versuche, einen Clob in Oracle einzufügen. Wenn ich dies mit einer OdbcConnection versuche, fügt es die Daten nicht in die Datenbank ein. Es gibt 1 Zeile betroffen und keine Fehler, aber nichts wird in die Datenbank eingefügt.Einfügen von Clobs in Orakel mit ODBC

Es funktioniert mit einer OracleConnection. Die Verwendung des Microsoft OracleClient führt jedoch häufig dazu, dass unsere Webdienste mit einer AccessViolationException abstürzen (Versuch, geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.). Dies passiert häufig, wenn wir OracleDataAdapter.Fill (Dataset) verwenden. Die Verwendung scheint also keine Option zu sein.

Gibt es eine Möglichkeit zum Einfügen/Aktualisieren von Clobs mit mehr als 4.000 Zeichen aus .Net mit einer OdbcConnection?

+0

Könnten Sie den Code schreiben Sie? verwenden sind –

Antwort

1

Ich habe nicht an der .NET-Plattform in einer Weile gearbeitet, so ist dies aus dem Speicher.

Soweit ich weiß, ist OdbcConnections Adapter für Oracle alt und Sie können nicht mehr als 4.000 Zeichen gleichzeitig einfügen/aktualisieren. Sie können eine gespeicherte Prozedur schreiben, um CLOB 4.000 Zeichen gleichzeitig zu übertragen und zu aktualisieren. Dies scheint jedoch ein mühsames und ineffizientes Mittel zu sein, um eine alternde Bibliothek zu unterstützen.

Also MS OracleConnection möglicherweise ein besserer Weg zum Debuggen. AccessViolationException wird meistens dadurch verursacht, dass der Distributed Transaction Controller (msdtc.exe) nicht gestartet wird, obwohl es zahlreiche andere mögliche Ursachen (einschließlich fehlerhafter Hardware) gibt.

Bevor Sie die Ausnahme untersuchen, müssen Sie eine dritte Verbindungsbibliothek in Betracht ziehen. Oracle DataAccess-Komponenten (ODAC ODP.NET), die in Ihrer Datenbanklizenz enthalten sein sollten. Es wird viel besser unterstützt als OdbcConnection und sollte das Exception-Throwing von OracleConnection umgehen.

+0

ich habe nun versucht, es mit Oracles ODP.NET und es scheint zu funktionieren. ich möchte versuchen die gespeicherte Prozedur versuchen auch. Alle Beispiele? – Carra

1

Ich glaube nicht, dass dies ein Problem mit ODBC ist, sondern eher eine Begrenzung für Orakel Teil. Wenn Sie eine SELECT-Anweisung einfügen oder aktualisieren, können Sie nicht mehr als 4000 Zeichen verwenden. Der empfohlene Weg hierfür ist die Verwendung von Bindevariablen und plsql. Ich weiß, das wie eine sehr hässliche Lösung klingt, aber es ist alles, was ich bisher gefunden habe;. (

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

+0

Der Link hier ist gebrochen ... – LThode

1

In meinem Tisch ich meine clob in ein Blob geändert konvertieren Sie Ihren Text in Byte in Tabelle blob gehen. Array. dann beim Lesen Wert convery Byte-Array 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();