我是新来的。我有个问题。我想在C#中执行此代码:
string XMLData = File.ReadAllText(App.FolderImport + "\\" + FileName);
Command.CommandType = CommandType.StoredProcedure;
Command.CommandText = "PKG_DATA_EXCHANGE.IMPORT_DATA";
Command.Parameters.Add("pID_USER_M", OracleType.Number).Value = App.User.IdUser;
Command.Parameters.Add("pFILE_NAME", OracleType.VarChar).Value = FileName;
Command.Parameters.Add("pXMLDATA", OracleType.Clob).Value = XMLDataString;
Command.ExecuteNonQuery();
它适用于小型XMLDataString,但如果它更大,那么我会得到异常
ORA-01460
。
我知道它与CLOB问题有某种联系,但我不知道如何解决它。
我在这里寻找这样的问题,但我没有运气。
请非常感谢任何帮助,链接或代码!
答案 0 :(得分:1)
还有其他报告的ORA-01460原因:
根据有关错误5872943的信息,似乎与ODP.NET相关联的ORA-01460虽然不是ODP错误,但仍然存在于数据库版本11.2中,并且已报告为已修复。
答案 1 :(得分:0)
解决方案是创建一个 OracleClob 对象来接收 Open() 连接,然后我们将值写入字节数组到它。
如果您使用 EF 和 Context,您可以按如下方式访问连接字符串:
string connectionString = _context.Database.GetDbConnection().ConnectionString;
代码如下所示:
using OracleConnection connection = new(connectionString);
try
{
connection.Open(); //required
byte[] arrayByte = System.Text.Encoding.Unicode.GetBytes(audit.AuditRecord);
OracleClob oracleClob = new (connection);
oracleClob.Write(arrayByte, 0, arrayByte.Length);
var parameters = new OracleParameter[]
{
new OracleParameter("param1", OracleDbType.Varchar2, valueParam1, ParameterDirection.Input),
new OracleParameter("param_clob", OracleDbType.Clob, oracleClob, ParameterDirection.Input),
new OracleParameter("p_refcursor", OracleDbType.RefCursor, ParameterDirection.Output)
};
OracleCommand cmd= new("SCHEMA.STORED_PROCEDURE_NAME", connection)
{
CommandType = CommandType.StoredProcedure,
};
cmd.Parameters.AddRange(parameters);
cmd.ExecuteNonQuery();
//getting the returned values
var result = (OracleRefCursor)cmd.Parameters["p_refcursor"].Value;
var reader = result.GetDataReader();
reader.Read();
// To access the returned values
//reader.GetOracleValue(0)
//reader.GetOracleValue(1)
//reader.GetOracleValue(2)
}
finally
{
connection.Close();
}