C#asp.net:错误 - 没有为一个或多个必需参数

问题描述:

这里给出的值是数据库层功能的代码:C#asp.net:错误 - 没有为一个或多个必需参数

public static dsPersonnel GetPersonnel(string Database, string strSearch) 
    { 
     dsPersonnel DS; 
     OleDbConnection sqlConn; 
     OleDbDataAdapter sqlDA; 

     //create the connection string 
     sqlConn = new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;" + 
      "Data Source=" + Database); 

     string query; 
     if (strSearch == "" || strSearch.Trim().Length == 0) 
     { 
      query = "SELECT * from tblPersonnel"; 
     } 
     else 
     { 
      query = "SELECT * FROM tblPersonnel WHERE LastName = " + strSearch + ""; 
     } 




     //create the adapter with query 
     sqlDA = new OleDbDataAdapter(query, sqlConn); 

     //create the dataset 
     DS = new dsPersonnel(); 

     //fill the data set 
     sqlDA.Fill(DS.tblPersonnel); 

     //return the dataset 
     return DS; 
    } 
} 

如果回发提交了一个空字符串我有它返回的所有记录。但是当一个实际的字符串被传递给函数时,我得到错误“没有给出一个或多个所需参数的值”。对于行

sqlDA.Fill(DS.tblPersonnel); 

在调试中,我验证了字符串正在为两种情况构建正确,但我得到后者的错误。 我知道我应该使用参数化查询,但这是我在课堂上学习过程中的一步。一次一个问题:)。有关这里的问题的任何建议是?

+0

您的代码可以广泛应用于[SQL注入](http://en.wikipedia.org/wiki/SQL_injection)。 – Oded 2011-03-27 20:49:03

query = 
    "SELECT * FROM tblPersonnel WHERE LastName = '" + 
     strSearch + 
     "'"; 

添加引号搜索条件

+0

我发现它几乎只要我发布这个哈哈。多谢你们。定时器启动后会选择第一个答案。 – Sinaesthetic 2011-03-27 20:49:38

尝试

query = "SELECT * FROM tblPersonnel WHERE LastName = '" + strSearch + "'"; 

或更好

query = string.Format("SELECT * FROM tblPersonnel WHERE LastName = '{0}'", strSearch); 
+1

@Oded - 这不是一个参数化查询,并具有与使用串联相同的安全问题。唯一的区别是它可能稍微更有效率。 string.Format会很高兴地让你插入一个sql注入。 – 2011-03-27 20:53:18

+0

@Mystere人 - 我的坏。我看到了格式,并假定它是参数化的。 – Oded 2011-03-27 21:05:08

您必须在其在SQL单引号的字符串。

query = "SELECT * FROM tblPersonnel WHERE LastName = '" + strSearch + "'"; 

看起来好像你在引用传递给查询的参数。取而代之的

query = "SELECT * FROM tblPersonnel WHERE LastName = " + strSearch + ""; 

尝试

query = "SELECT * FROM tblPersonnel WHERE LastName = '" + strSearch.Replace("'", "''") + "'"; 

注意额外的单引号,也替换()语句,其正确逃逸包含在你的过滤器单引号(例如撇号)

必须重申您的示例代码确实包含多个问题和安全漏洞。