ado.net oracle存储过程输出varchar参数split-cut-truncated

时间:2014-11-04 16:47:46

标签: c# oracle stored-procedures ado.net

我有一个Oracle存储过程(SP)返回varchar参数,但是当我执行SP并尝试读取输出时,字符串被剪切掉。当我在Toad上执行SP并发出dbms.output时,字符串就会被很好地返回。

procedure testStringOutput(num in number, str out varchar2)
as

V_C NUMBER(38);
V_E VARCHAR2(2000);
begin
    select '12345678910111213141516171819PPPPPPPPPPPPPPPPPPPPPPPPP'
    into str
    FROM DUAL;

exception
when others then
V_C := SQLCODE;
V_E:= SQLERRM;
dbms_output.put_line(V_C||'-> '||V_E);
end;

我将SP称为脚本的方式:

declare
P2 VARCHAR2(2000) :='';
begin
PKGTEST.TESTSTRINGOUTPUT(1,P2);
dbms_output.put_line('output string - > '||P2);
end;

输出:

output string - > 12345678910111213141516171819PPPPPPPPPPPPPPPPPPPPPPPPP

从c#调用SP的方式:

public void TestOutputString()
{
    string str = string.Empty;
    using (connection)
    {
        OracleCommand objCmd = new OracleCommand();
        objCmd.Connection = connection;
        objCmd.CommandText = "PKGTEST.testStringOutput";
        objCmd.CommandType = CommandType.StoredProcedure;
        objCmd.Parameters.Add("num", OracleType.Number).Value = 0;
        objCmd.Parameters.Add("str", OracleType.VarChar, 2000).Direction = ParameterDirection.Output;

        foreach (OracleParameter parameter in objCmd.Parameters)
            if (parameter.Value == null)
                parameter.Value = DBNull.Value;

        try
        {
            connection.Open();
            objCmd.ExecuteNonQuery();
            str = (objCmd.Parameters["str"].Value.ToString());
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        connection.Close();
    }
}

但是当我检查响应字符串时,它被拆分为123456789101112131415161718,另一部分(19PPPPPPPPPPPPPPPPPPPPPPPPP)丢失。请参阅此image

我做错了什么?

更新:我确定它发生了,SP向WCF服务返回消息,但是当客户端收到响应时,它被拆分了。

1 个答案:

答案 0 :(得分:0)

最后我必须使用Oracle数据提供程序odp.net而不是ado.net - System.Data.OracleClient(不建议使用)并且它可以工作。