2010-08-16 3 views
9

Wenn ich versuche, ein Orakel Aufruf der gespeicherten Prozedur mit clob Ein- und Ausgabe in C# zu erstellen, bekomme ich folgende Fehlermeldung:"ORA-01036: illegal Variablenname/Zahl n" für Oracle clob in C#

ORA-01036: illegal variable name/number\n 

Hier ist der Code selbst:

OracleTransaction transaction = connection.BeginTransaction(); 
OracleCommand command = connection.CreateCommand(); 
command.Transaction = transaction; 
command.CommandText = 
     @"declare xx clob; 
     begin dbms_lob.createtemporary(xx, false, 0); 
     :tempclob := xx; end;"; 

command.Parameters.Add(new OracleParameter("tempclob", OracleType.Clob)) 
    .Direction = ParameterDirection.Output; 

command.ExecuteNonQuery(); 

OracleLob tempLob = (OracleLob)command.Parameters[0].Value; 
//byte[] tempbuff = new byte[10000]; 
byte[] tempbuff = System.Text.Encoding.Unicode.GetBytes(generateXMLMessage()); 

tempLob.BeginBatch(OracleLobOpenMode.ReadWrite); 
tempLob.Write(tempbuff, 0, tempbuff.Length); 
tempLob.EndBatch(); 
command.Parameters.Clear(); 
command.CommandText = "InsertMessageAndGetResponseWRP"; 
command.CommandType = CommandType.StoredProcedure; 
//command.Parameters 
//.Add(new OracleParameter("ImportDoc", OracleType.Blob)).Value = tempLob; 
command.Parameters.Add(new OracleParameter("iSourceSystem", OracleType.VarChar)) 
     .Value = "XXX"; 

command.Parameters.Add(new OracleParameter("iMessage", OracleType.Clob)) 
     .Value = tempLob; 


command.Parameters.Add(new OracleParameter("iResponseMessage", OracleType.Clob)).Direction = ParameterDirection.Output; 
command.Parameters.Add(new OracleParameter("retVar ", OracleType.Int32)).Direction = ParameterDirection.Output; 

command.ExecuteNonQuery(); 
transaction.Commit(); 
+0

Warum ist das eine CW-Frage? – MarioDS

Antwort

1

versuchen Sie einfach

command.CommandText = 
     @"declare xx clob; 
     begin dbms_lob.createtemporary(xx, false, 0); 
     tempclob := xx; end;"; 

ersetzen :tempclob mit tempclob.

0

Welcher der beiden Aufrufe von ExecuteNonQuery() generiert den Fehler? Ich schätze, es ist der zweite.

Ich mache nicht C#, aber aus mehreren Beispielen, die ich online gefunden habe, sieht es so aus, als wenn Sie den StoredProcedure-Befehlstyp verwenden, Sie keine OracleParameter-Objekte erstellen möchten. Stattdessen initialisieren Sie die Parameter wie folgt:

command.Parameters.Add("iSourceSystem", OracleType.VarChar).Value = "XXX"; 
0

Es sieht so aus, als ob Sie den Microsoft Oracle-Client verwenden.

Verwenden Sie den Oracle 11-Client mit ODP.Net für 4.0. Dies ergibt die besten Ergebnisse im Umgang mit Clobs.

0

Versuchen Zugabe:

command.BindByName = true; 

, nachdem Sie Ihre Parameter nennen.

0

Binding-Variable zu einem anonymen pl/sql-Block wird nicht unterstützt. Verwenden Sie eine Prozedur und definieren Sie stattdessen alle Parameter.

command.CommandText = "dbms_lob.createtemporary"