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字符串中。任務是重構一個類以在現有項目中工作。
上面的代碼示例演示了一個我必須解決的問題,我想知道還有其他問題。本質上,問題是創建一個將字符串轉換爲參數化查詢的類。有沒有人做過這個,可能會有什麼陷阱或技巧?
這不幫助我:我無法保證sql會是什麼,因爲它從別處傳遞到我的組件。請注意,在第二個查詢中,我沒有CAST(),但firebird沒有問題。舊的組件會產生第二種形式的查詢,但我需要第一種形式的東西。 – 2012-07-12 18:42:15
你能幫我解答我在原問題結尾提出的3個問題嗎? – 2012-07-13 16:47:31
在第二個查詢中,Firebird能夠從與'789'的比較中派生出類型。在您的第一個查詢中,Firebird不知道該類型,因此他們的查詢無法進行準備,這是Firebird的查詢解析器中的限制。 – 2012-07-13 16:54:25