2011-02-23 60 views
1

這是我的代碼:爲什麼我會得到OleDBException「沒有給出一個或多個必需參數的值?」

command.CommandText = 
    "SELECT DISTINCT B.* FROM BlankFormSubmissions B, Actions A WHERE B.FormName = " + 
    GenericRoutines.SqlFmt(form.Name) + 
    " AND B.ProcessName = A.ProcessName AND B.ActionName = A.ActionName" + 
    " ORDER BY B.ID"; 

OleDbDataReader reader = command.ExecuteReader(); 

的SQL是:

SELECT DISTINCT B.* 
FROM BlankFormSubmissions B, Actions A 
WHERE B.FormName = 'FindingNemo' 
    AND B.ProcessName = A.ProcessName 
    AND B.ActionName = A.ActionName 
ORDER BY B.ID 
+4

使用**參數化**查詢,而不是連接在一起你的SQL語句 - 幫助[避免SQL注入攻擊](http://xkcd.com/327/)..... – 2011-02-23 10:22:23

+0

嗨,它是如何工作的您只能使用命令文本:「SELECT DISTINCT B. * FROM BlankFormSubmissions B,Actions A」? – 2011-02-23 10:23:26

+0

雖然你在這裏 - 嘗試使用新的,標準化的ANSI JOIN語法和「INNER JOIN .... ON .....」子句 - 有助於避免不需要的直角座標產品,並且閱讀起來更加清晰並理解... – 2011-02-23 10:24:23

回答

4

我發現通過在Access中運行SQL,實際上我只是引用了Access表中不存在的列(FormName)。

0

你需要引用你傳遞到您的查詢的任何字符串。嘗試:

command.CommandText = "SELECT DISTINCT B.* FROM BlankFormSubmissions B, Actions A WHERE B.FormName = '" + 
     GenericRoutines.SqlFmt(form.Name) + "' AND B.ProcessName = A.ProcessName AND B.ActionName = A.ActionName" + 
     " ORDER BY B.ID"; 

它更容易(一旦你得到了在V未成年人的學習曲線參與。)和更好(更整潔,更安全)使用參數化查詢存儲過程做這樣的事情。

HTH。

+0

謝謝,但我的方法SqlFmt()爲我添加了引號。 – 2011-02-23 10:41:14

+0

來自計算的古老諺語,用首字母縮略詞'PSIGSO'總結 - '把Sh1t放進去,讓出去'。也許發佈一個更完整的代碼示例會得到更多有用的答案;-) 很高興您對它進行了排序。 – 5arx 2011-02-23 10:48:33

+0

我認爲我發佈了我的代碼生成的SQL就足夠了......這個事實。 – 2011-02-24 15:34:42

相關問題