2017-03-08 127 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));