简体   繁体   English

C#Oracle试图传递字符串参数-ORA-01722:无效的数字

[英]C# oracle trying to pass string parameter - ORA-01722: invalid number

I'm trying to pass parameters using the oracle parameters. 我正在尝试使用oracle参数传递参数。 It works fine with int types but for my string type it fails with the error: 它可以与int类型一起正常工作,但对于我的字符串类型,它将失败并显示以下错误:

ORA-01722: invalid number
[OracleException (0x6ba): ORA-01722: invalid number]
   OracleInternal.ServiceObjects.OracleCommandImpl.VerifyExecution(OracleConnectionImpl connectionImpl, Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, OracleException& exceptionForArrayBindDML, Boolean& hasMoreRowsInDB, Boolean bFirstIterationDone) +1047
   OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteReader(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, OracleDataReaderImpl& rdrImpl, Int32 longFetchSize, Int32 lobPrefetchSize, OracleDependencyImpl orclDependencyImpl, Int64[] scnForExecution, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, Boolean isDescribeOnly, Boolean isFromEF) +13029
   Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior) +2739
   Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader() +210
   Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteScalar() +406
   AspWebReqManagedOracleTest.ParameterizedSql.ExecScalarQuery() in c:\max\git_root\oboe-test\automation\chef-repo\site-cookbooks\fixture\files\default\win_dotnet_sample_apps\AspWebReqManagedOracleTest\ParameterizedSql.aspx.cs:68
   AspWebReqManagedOracleTest.ParameterizedSql.Page_Load(Object sender, EventArgs e) in c:\max\git_root\oboe-test\automation\chef-repo\site-cookbooks\fixture\files\default\win_dotnet_sample_apps\AspWebReqManagedOracleTest\ParameterizedSql.aspx.cs:21
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51
   System.Web.UI.Control.OnLoad(EventArgs e) +92
   System.Web.UI.Control.LoadRecursive() +54
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772

Here is my code: 这是我的代码:

OracleConnection conn = new OracleConnection(connectionString);
try
{
    conn.Open();
    OracleCommand cmd = new OracleCommand();
    cmd.Connection = conn;
    cmd.CommandText = "SELECT count(*) from SALES_ADVENTUREWORKS2012.SALESORDERDETAIL where (PRODUCTID=:productid or ROWGUID like :rowguid) and ROWNUM<:limit";
    cmd.Parameters.Add(new OracleParameter("limit", 90));
    cmd.Parameters.Add(new OracleParameter("productid", 773));
    OracleParameter par = new OracleParameter("rowguid", OracleDbType.Char);
    par.Value = "hi";
    cmd.Parameters.Add(par);

    cmd.CommandType = CommandType.Text;
    object o = cmd.ExecuteScalar();
}
finally
{
    conn.Close();
}

Note that if I pass the string parameter rowguid embedded in the query, it works fine (so there is nothing wrong with 'limit' and 'productid' parameters). 请注意,如果我通过嵌入在查询中的字符串参数rowguid,它可以正常工作(因此'limit'和'productid'参数没有任何问题)。 I've tried using Char, NChar, NVarchar2; 我尝试使用Char,NChar,NVarchar2; also tried specifying the size. 还尝试指定大小。 Any ideas what's wrong? 任何想法有什么问题吗?

As I said, the query works fine when not using the parameters. 如我所说,当不使用参数时,查询工作正常。 In order to make it work, I had to remove the last condition: 为了使其工作,我必须删除最后一个条件:

where ROWNUM<:limit

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM