尝试使用参数化查询查询AS400数据库。这是我的代码:
string connectionString = ConfigurationManager.ConnectionStrings["****"].ConnectionString;
using (OleDbConnection con = new OleDbConnection(connectionString))
using (OleDbCommand command = con.CreateCommand())
{
string sqlStr = @"SELECT CASE IsBatch WHEN 'Y' THEN 1 ELSE 0 END
FROM Batch200
WHERE BatchID=LEFT(?,4) AND BatchNumber=CAST(RIGHT(?,9)AS INT)";
command.CommandType = CommandType.Text;
command.CommandText = str;
command.Parameters.Add(new OleDbParameter("@p1", polNumber));
var option = command.ExecuteScalar();
}
我尝试了两个查询,但没有一个正在运行。如何解决这个问题?
收到此错误消息:
SQL5016:合格的对象名称****无效。
原因。 。 。 。 。 :发生以下情况之一:
- 用于限定对象名称的语法对指定的命名选项无效。使用系统命名,对象名称的限定形式是schema-name / object-name。使用SQL命名对象名称的限定形式是authorization-name.object-name。
- 不允许使用用于限定对象名称的语法。用户定义的类型不能使用SQL过程或函数的参数和SQL变量的系统命名约定中的模式进行限定。
恢复。 。 。 :执行以下操作之一并再次尝试请求:
- 如果要使用SQL命名约定,请在相应的SQL命令中验证SQL命名选项,并以authorization-id.object-name格式限定对象名称。
- 如果要使用系统命名约定,请在相应的SQL命令中指定系统命名选项,并使用schema-name / object-name形式限定对象名称。
- 使用系统命名约定,确保可以在当前路径中找到为SQL例程中的参数和变量指定的用户定义类型。
答案 0 :(得分:1)
你缺少参数。 SqlStr需要两个。
我认为应该读取类似
的内容string sqlStr = @"SELECT CASE IsBatch WHEN 'Y' THEN 1 ELSE 0 END
FROM Batch200
WHERE BatchID=LEFT(@BATCHID,4) AND BatchNumber=CAST(RIGHT(@BATCHNUMBER,9)AS INT)";
然后您将添加两个参数
command.Parameters.Add(new OleDbParameter("@BATCHID", batchID));
command.Parameters.Add(new OleDbParameter("@BATCHNUMBER", batchNumber));