2011-02-23 61 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

相关问题