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都推荐的参数,但我不得不尝试。对于五位数的错误代码,我对通用消息有点失望。;)