【问题标题】:Why am I getting OleDBException "No value given for one or more required parameters?"为什么我会收到 OleDBException“没有为一个或多个必需参数提供值?”
【发布时间】:2011-02-23 10:18:43
【问题描述】:

这是我的代码:

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

【问题讨论】:

  • 使用 参数化 查询而不是将 SQL 语句连接在一起 - 帮助avoid SQL injection attacks.....
  • 您好,如果您只使用命令文本,它是如何工作的:“SELECT DISTINCT B.* FROM BlankFormSubmissions B, Actions A”?
  • 当您使用它时 - 尝试使用带有 INNER JOIN .... ON ..... 子句的更新的标准化 ANSI JOIN 语法 - 有助于避免不需要的笛卡尔积,并且更易于阅读和理解。 .
  • 谢谢大家,但是这段代码完全可以防止任何你看不到的方法的攻击,GenericRoutines.SqlFmt(...)
  • @Lost Hobbit - 如果这是真的,我会喜欢看看 SqlFmt。

标签: c# .net sql oledb


【解决方案1】:

通过在 Access 中运行 SQL 发现,我实际上只是引用了 Access 表中不存在的列 (FormName)。

【讨论】:

    【解决方案2】:

    您需要引用传递给查询的任何字符串。试试:

    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";
    

    使用参数化查询存储过程更容易(一旦你克服了所涉及的次要学习曲线)和更好(更整洁、更安全)这种事。

    HTH。

    【讨论】:

    • 谢谢,但我的方法 SqlFmt() 为我添加了引号。
    • 一句古老的计算格言,用首字母缩略词“PSIGSO”进行概括——“Put Sh1t in, Get Sh1t Out”。也许发布更完整的代码示例会给您提供更有用的答案;-) 很高兴您已对其进行了排序。
    • 我认为我发布了我的代码生成的 SQL 就足够了......哦,好吧。
    • 如果没有表定义,一切都是错误的,因为 IDE 找不到您引用的任何数据库对象。这是 StackOverflow,而不是与全能上帝的直接联系;-)
    猜你喜欢
    • 2022-01-11
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多