uba*_*raf 9 c# sql asp.net ado.net oracle11g
我正在使用oracle 11g.我的存储过程正在返回,varchar2
但它的值被截断了oracle client
.以下是我的代码:
if ((ds != null) && (ds.Tables.Count > 0))
{
foreach (DataRow rw in ds.Tables[0].Rows)
{
OracleParameter param = new OracleParameter((rw["argument_name"]).ToString(), GetOracleType(rw["data_type"].ToString().ToUpper()));
param.Direction = GetParameterDirection((rw["in_out"]).ToString().ToUpper());
discoveryCommand.Parameters.Add(param);
if (param.Direction == ParameterDirection.Output && param.OracleType == OracleType.VarChar)
{
param.Size = 4000;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我增加了param.size
到4000
,但仍值被截断.对此有什么解决方案吗?在服务器上我有Oracle 12c.我需要在我的项目中不更新oracle客户端版本的情况下获得解决方案,因为某些原因不允许这样做.
以下是SP.我修改它以返回硬编码值.还是同样的问题.
PROCEDURE access_level (
p_emp_id IN employees.emp_id%TYPE,
p_id IN NUMBER,
p_type VARCHAR2,
p_access_level OUT VARCHAR2
) IS
BEGIN
p_access_level := 'X' || 'RO' || 'RW';
END IF;
Run Code Online (Sandbox Code Playgroud)
我无法为连接到服务器12.1.0.1.0的客户端版本11.2.0.1.0重现您的问题.这是Oracle 12c客户端截断输出变量的已知情况,但是如果您使用的是11g版本的客户端,则不应该是您的情况.
我使用了以下测试表和存储过程:
CREATE TABLE TEST_TABLE
(
ID NUMBER(11) NOT NULL,
NAME VARCHAR2(256),
CONSTRAINT TEST_TABLE_PK PRIMARY KEY (ID)
)
/
INSERT INTO TEST_TABLE(ID, NAME) VALUES(1, 'Some test data')
/
CREATE PROCEDURE TEST_PROCEDURE
(
P_ID OUT NUMBER,
P_NAME OUT VARCHAR2
)
AS
BEGIN
SELECT ID, NAME INTO P_ID, P_NAME FROM TEST_TABLE;
END;
Run Code Online (Sandbox Code Playgroud)
以下是正确提取数据的客户端代码:
using (OracleConnection connection = new OracleConnection())
{
connection.ConnectionString = ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString;
connection.Open();
using (OracleCommand command = connection.CreateCommand())
{
command.CommandText = "TEST_PROCEDURE";
command.CommandType = CommandType.StoredProcedure;
OracleParameter param1 = new OracleParameter("P_ID", OracleType.Number);
param1.Direction = ParameterDirection.Output;
command.Parameters.Add(param1);
OracleParameter param2 = new OracleParameter("P_NAME", OracleType.VarChar);
param2.Size = 4000;
param2.Direction = ParameterDirection.Output;
command.Parameters.Add(param2);
using (command.ExecuteReader())
{
Console.WriteLine($"Output: [{param2.Value}]");
}
}
}
Run Code Online (Sandbox Code Playgroud)
要继续提出您的问题,请执行以下操作:
如果由于某种原因不可能,请提供以下信息:
魔鬼永远在细节中.我们应该理解您的情况与上述工作示例代码的不同之处.
我尝试通过迁移到此处提到的 as 来解决ODP.NET
问题
,但问题尚未解决。以下是问题的解决方式:System.Data.OracleClient
Microsoft
12.1.0.2.2
Output parameter truncation
Oracle
文档中提到的错误为Bug21616079
Oracle
已在此处的文档12.2.0.1.0
中提到的版本中给出修复。Oracle
12.2.0.1.0
,12.1.0.2.2
因为Oracle
仅在此版本中给出了修复,官方Oracle
文档中提到了这一点,我在上面的第 3 点中提供了链接。