使用Oledb命令构建查询以查询AS400数据库

时间:2017-03-08 22:34:33

标签: c# ado.net oledb ibm-midrange db2-400

尝试使用参数化查询查询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例程中的参数和变量指定的用户定义类型。

1 个答案:

答案 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));