【发布时间】:2017-03-08 22:34:32
【问题描述】:
我正在尝试使用参数化查询来查询 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 命名,对象名称的限定形式是授权名称.对象名称。
-- 用于限定对象名称的语法是不允许的。用户定义的类型不能使用 SQL 过程或函数的参数和 SQL 变量的系统命名约定中的模式来限定。
恢复。 . . :执行以下操作之一,然后重试请求:
-- 如果要使用 SQL 命名约定,请验证相应 SQL 命令中的 SQL 命名选项,并以授权 ID.对象名称的形式限定对象名称。
-- 如果要使用系统命名约定,请在相应的 SQL 命令中指定系统命名选项,并以 schema-name/object-name 的形式限定对象名称。
-- 使用系统命名约定,确保SQL例程中为参数和变量指定的用户定义类型可以在当前路径中找到。
【问题讨论】:
-
为什么说“不工作”是什么意思?
-
将连接字符串存储在 .Config 文件中,然后将这一行
using (OleDbCommand command = con.CreateCommand())更改为using(OleDbCommand command = new OleDbCommand(sqlStr, con))还要查找CASE WHEN的语法,如果语法相同,则应该END as IsBatchSql Server 中的示例 -
@abatishchev 添加了异常
标签: c# ado.net oledb ibm-midrange db2-400