2012-07-12 68 views
2

我想知道是否有人可以幫忙以下。正確使用FirebirdSql中的參數

using (FbConnection conn = new FbConnection(ConnectionString)) 
{ 
    conn.Open(); 

    // -------------------------------------------------------------------------- 
    FbCommand command1 = new FbCommand("SELECT @AN_INT FROM RDB$DATABASE", conn); 
    command1.Parameters.Add("AN_INT", FbDbType.Integer); 
    try 
    { 
     command1.Prepare(); // Message=Dynamic SQL Error 
          //SQL error code = -804 
          //Data type unknown 
          // Source=FirebirdSql.Data.FirebirdClient 
          // ErrorCode=335544569 
          // SQLSTATE=42000 
    } 
    catch(Exception E) 
    { 
     MessageBox.Show(E.Message); 
    } 
    // -------------------------------------------------------------------------- 
    FbCommand command2 = new FbCommand("SELECT 123 FROM RDB$DATABASE WHERE 789 >= @AN_INT", conn); 
    command2.Parameters.Add("AN_INT", FbDbType.Integer); 
    try 
    { 
     command2.Prepare(); // No Problem 
    } 
    catch (Exception E) 
    { 
     MessageBox.Show(E.Message); 
    } 
} 

我的問題是這樣的 - 我從另一個編碼器拿起一個項目,我認爲,如果可能的話,我應該改變數據庫組件使用參數化查詢;現有技術是將值注入到Sql字符串中。任務是重構一個類以在現有項目中工作。

上面的代碼示例演示了一個我必須解決的問題,我想知道還有其他問題。本質上,問題是創建一個將字符串轉換爲參數化查詢的類。有沒有人做過這個,可能會有什麼陷阱或技巧?

回答

2

您的第一個查詢需要是SELECT cast(@AN_INT as int) FROM RDB$DATABASE。否則Firebird不知道參數類型是什麼(即使它是用C#代碼指定的)。

您可以嘗試直接在Firebird中運行這段代碼,以查看引擎本身的限制。

execute block 
as 
begin 
    execute statement ('select :foobar from rdb$database')(foobar := 10); 
end 
+0

這不幫助我:我無法保證sql會是什麼,因爲它從別處傳遞到我的組件。請注意,在第二個查詢中,我沒有CAST(),但firebird沒有問題。舊的組件會產生第二種形式的查詢,但我需要第一種形式的東西。 – 2012-07-12 18:42:15

+0

你能幫我解答我在原問題結尾提出的3個問題嗎? – 2012-07-13 16:47:31

+0

在第二個查詢中,Firebird能夠從與'789'的比較中派生出類型。在您的第一個查詢中,Firebird不知道該類型,因此他們的查詢無法進行準備,這是Firebird的查詢解析器中的限制。 – 2012-07-13 16:54:25