Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ORA-01008,所有变量均已绑定_C#_Oracle_Oracleclient_Ora 01008 - Fatal编程技术网

C# ORA-01008,所有变量均已绑定

C# ORA-01008,所有变量均已绑定,c#,oracle,oracleclient,ora-01008,C#,Oracle,Oracleclient,Ora 01008,我正在使用System.Data.OracleClient,它按名称进行参数绑定,并正在验证CommandText和参数是否同步: public string CommandText { get; set; } public IEnumerable<OracleParameter> Parameters { get; set; } private void VerifyThatAllParametersAreBound() { var

我正在使用
System.Data.OracleClient
,它按名称进行参数绑定,并正在验证CommandText和参数是否同步:

    public string CommandText { get; set; }
    public IEnumerable<OracleParameter> Parameters { get; set; }

    private void VerifyThatAllParametersAreBound()
    {
        var variableNames = Regex.Matches(CommandText, ":\\w+")
            .Cast<Match>().Select(m => m.Value).ToArray();
        var parameteterNames = Parameters.Select(p => p.ParameterName).ToArray();

        var unboundVariables = variableNames.Except(parameteterNames).ToArray();
        if (unboundVariables.Length > 0)
        {
            throw new Exception("Variable in CommandText missing parameter: "
                + string.Join(", ", unboundVariables) + ".");
        }

        var unboundParameters = parameteterNames.Except(variableNames).ToArray();
        if (unboundParameters.Length > 0)
        {
            throw new Exception("Parameter that is not used in CommandText: "
                + string.Join(", ", unboundParameters) + ".");
        }
    }
publicstringcommandtext{get;set;}
公共IEnumerable参数{get;set;}
私有void验证所有参数都已绑定()
{
var variableNames=Regex.Matches(CommandText,“:\\w+”)
.Cast().Select(m=>m.Value).ToArray();
var parameterNames=Parameters.Select(p=>p.ParameterName.ToArray();
var unboundVariables=variableNames.Except(parameteterNames.ToArray();
如果(unboundVariables.Length>0)
{
抛出新异常(“CommandText中的变量缺少参数:”
+Join(“,”,unboundVariables)+“);
}
var unboundParameters=参数ternames.Except(variableNames.ToArray();
如果(unboundParameters.Length>0)
{
抛出新异常(“CommandText中未使用的参数:”
+Join(“,”,unboundParameters)+“);
}
}
还有一个查询抛出
ORA-01008:并非所有变量都绑定了
。当手动将参数值插入有问题的CommandText时,查询将运行,因此CommandText和参数值应为ok。我使用:作为变量和参数名称的前缀,它适用于其他查询

我怎样才能找出这个异常的原因呢?

我相信大约2年前,微软已经将OracleClient作为ADO.NET的一部分

您可能想考虑使用Oracle的数据访问组件(ODAC ODP.NET)。使用OracleParameter类轻松构建(和检查计数)参数。找到安装和安装文档。哦,你也可以进入他们的实体框架(和LINQ)支持(我想还是测试版?)


无论如何都要认真考虑。

< P>错误并没有指定null值。所以

new OracleParameter(":Foo", item.Foo)
必须预先放置

item.Foo == null 
    ? new OracleParameter(":Foo", DBNull.Value) 
    : new OracleParameter(":Foo", item.Foo)

我认为它在早期使用ODT.NET时没有进行空检查,但尚未确认。显然,
System.Data.OracleClient
正在删除带有空值的参数。

如果将null作为参数值传递,则如果传递DBNull.value则会得到“未绑定所有变量”的结果,否则会在OracleClient中的某个位置出现运行时错误。若要传递NULL,请使用string.Empty,OracleClient将其转换为任何数据库类型的NULL

如果有多个参数,则需要将BindByName设置为true。例如:

OracleCommand cmd = con.CreateCommand();

cmd.BindByName = true;

cmd.Parameters.Add(new OracleParameter("parameter1", parameter1));
cmd.Parameters.Add(new OracleParameter("parameter2", parameter2));

基于上述回答和意见,我确定以下事项来解决此问题:

  • 参数的绑定顺序与它们在查询中的显示顺序相同
  • 已指定参数类型
  • 如果在SQL中多次需要相同的参数值,请在SQL中以不同的方式命名每个参数(不确定是否需要)

    OracleParameter[]orclParams=新的OracleParameter[] { 新OracleParameter{ ParameterName=“param1”, OracleDbType=OracleDbType.Varchar2, Value=“abc”}, 新OracleParameter{ ParameterName=“param2”, OracleDbType=OracleDbType.Varchar2, Value=“abc”}, 新OracleParameter{ ParameterName=“date1”, OracleDbType=OracleDbType.Date, 值=myDate} }; SomeFunction(sqlQuery,orclParams.ToList())


您有进行查询的代码吗?另外,您是否尝试过oracle(或其他供应商).net客户端?我想微软已经不再提供oracle客户端了。我隐约记得其中一个oracle客户端出现了一个问题,即参数必须按照查询中显示的顺序绑定,否则将无法工作-这可能是问题所在吗?@Nick-出于可读性和ip原因,该命令是一个包含约40个参数的更新我把它们掉了。我尝试使用Oracle的ODT.NET,但在部署时遇到了问题。(另见下面的评论)我的意思是。现在我将再次尝试使用它,因为可能有实际的理由使用它。由于错误代码来自Oracle,我认为所有参数都已传输,但可能与数据类型有关?我创建这样的参数
新的OracleParameter(“:myParam”,obj.myParam)
。是的,我宁愿使用oracle和microsoft都推荐的参数,但我不得不尝试。对于五位数的错误代码,我对通用消息有点失望。;)