2017-03-08 107 views
2

正试图使用​​参数化查询来查询AS400数据库。这是我的代码:使用Oledb命令构建查询以查询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:合格对象名称****无效。

原因。 。 。 。 。 :发生以下某种情况:

- 用于限定对象名称的语法对指定的命名选项无效。使用系统命名,对象名称的限定格式是模式名称/对象名称。使用SQL命名对象名称的限定格式为authorization-name.object-name。

- 不允许使用用于限定对象名称的语法。用户定义的类型不能使用SQL过程或函数的参数和SQL变量的系统命名约定中的模式进行限定。

恢复。 。 。 :执行以下操作之一并再次尝试请求:

- 如果要使用SQL命名约定,请在适当的SQL命令中验证SQL命名选项,并以authorization-id形式限定对象名称。对象的名字。

- 如果要使用系统命名约定,请在相应的SQL命令中指定系统命名选项,并以schema-name/object-name格式限定对象名称。

- 使用系统命名约定,确保可以在当前路径中找到为SQL例程中的参数和变量指定的用户定义类型。

+0

你是什么意思,为什么说做“不工作”? – abatishchev

+0

将连接字符串存储在.Config文件中,然后使用(OleDbCommand命令=新的OleDbCommand(sqlStr,con))将该连接字符串更改为 '使用(OleDbCommand command = con.CreateCommand())'到 ''也查找您的'CASE WHEN'的语法,如果语法相同(例如在Sql Server中),您应该将'END作为IsBatch' – MethodMan

+0

@abatishchev添加了异常 – PRK

回答

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