1

我是新来的。我有个问题。我想在 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 问题有关,但我不知道如何解决它。

我在这里寻找这样的问题,但我没有运气。

请任何帮助,链接或代码将不胜感激!

4

2 回答 2

1

ORA-01460 还有其他报告的原因:

  • 不兼容的字符集会导致 ORA-01460
  • 使用 SQL Developer,尝试将超过 4000 字节的字符串传递给绑定变量值可能会导致 ORA-01460
  • 使用 ODP,用户从 10.2 客户端和 10.2 ODP 移动到 11.1 客户端和 11.1.0.6.10 ODP 报告了 ORA-01460 错误(这是一个应该通过将 ODP 修补到最新版本来修复的错误)

根据有关错误 5872943 的信息,与 ODP.NET 相关的 ORA-01460 似乎不是 ODP 错误,但在数据库版本 11.2 中仍然存在,据报告该问题已修复。

于 2013-08-15T12:31:38.150 回答
0

一个解决方案是创建一个接收Open() 连接的OracleClob对象,然后我们将值作为字节数组写入它。

如果您使用的是EFContext,则可以按如下方式访问 conectionString:

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();
}
于 2021-07-15T14:14:05.237 回答