2009-06-04 5 views
0

J'essaie d'insérer un clob dans Oracle. Si j'essaye ceci avec un OdbcConnection il n'insère pas les données dans la base de données. Il renvoie 1 ligne affectée et aucune erreur mais rien n'est inséré dans la base de données.Insertion de clobs dans Oracle avec ODBC

Cela fonctionne avec OracleConnection. Cependant, l'utilisation de Microsoft OracleClient fait souvent planter nos services Web avec une exception AccessViolationException (tentative de lecture ou d'écriture de la mémoire protégée, ce qui indique souvent qu'une autre mémoire est corrompue). Cela arrive souvent lorsque nous utilisons OracleDataAdapter.Fill (dataset). Donc, cela ne semble pas être une option.

Y at-il un moyen d'insérer/mettre à jour des clobs avec plus de 4.000 caractères de .Net avec un OdbcConnection?

+0

Pouvez-vous poster le code que vous utilisez –

Répondre

1

Je n'ai pas travaillé sur la plate-forme .NET depuis un moment, donc c'est de la mémoire. Pour autant que je sache, l'adaptateur OdbcConnection pour Oracle est ancien et vous ne pouvez pas insérer/mettre à jour plus de 4 000 caractères à la fois. Vous pouvez écrire une procédure stockée pour transférer et mettre à jour les 4 000 caractères CLOB à la fois, mais cela semble être un moyen ardu et inefficace pour prendre en charge une bibliothèque vieillissante. Donc, OracleConnection de MS peut être un meilleur chemin pour déboguer. AccessViolationException est le plus souvent causée par le contrôleur de transactions distribuées (msdtc.exe) n'étant pas démarré, bien qu'il existe de nombreuses autres causes potentielles (y compris le matériel défectueux).

Avant d'étudier l'exception, il existe une troisième bibliothèque de connexions à prendre en compte. Composants DataAccess d'Oracle (ODAC ODP.NET), qui doivent être inclus avec votre licence de base de données. Il est beaucoup mieux supporté que OdbcConnection et devrait contourner le lancement d'exception d'OracleConnection.

+0

? Je l'ai maintenant essayé avec Oracles ODP.NET et il semble fonctionner. Je voudrais essayer la tentative de procédure stockée aussi Des exemples? – Carra

1

Je ne pense pas que ce soit un problème avec odbc mais plutôt une limitation sur la partie oracles. Si vous insérez ou mettez à jour en utilisant une instruction select, vous ne pouvez pas utiliser plus de 4000 caractères. La méthode recommandée pour ce faire consiste à utiliser des variables bind et plsql. Je sais que cela sonne comme une solution très laid, mais il est tout ce que je l'ai trouvé à ce jour;. (

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

+0

Le lien ici est cassé ... – LThode

1

Dans ma table j'ai changé clob dans un blob convertir votre texte allant dans blob de table à l'octet. tableau. puis lors de la lecture valeur tableau d'octets 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(); 
Questions connexes