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);
在调试中,我验证了字符串正在为两种情况构建正确,但我得到后者的错误。 我知道我应该使用参数化查询,但这是我在课堂上学习过程中的一步。一次一个问题:)。有关这里的问题的任何建议是?
query =
"SELECT * FROM tblPersonnel WHERE LastName = '" +
strSearch +
"'";
添加引号搜索条件
我发现它几乎只要我发布这个哈哈。多谢你们。定时器启动后会选择第一个答案。 – Sinaesthetic 2011-03-27 20:49:38
尝试
query = "SELECT * FROM tblPersonnel WHERE LastName = '" + strSearch + "'";
或更好
query = string.Format("SELECT * FROM tblPersonnel WHERE LastName = '{0}'", strSearch);
@Oded - 这不是一个参数化查询,并具有与使用串联相同的安全问题。唯一的区别是它可能稍微更有效率。 string.Format会很高兴地让你插入一个sql注入。 – 2011-03-27 20:53:18
@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("'", "''") + "'";
注意额外的单引号,也替换()语句,其正确逃逸包含在你的过滤器单引号(例如撇号)
必须重申您的示例代码确实包含多个问题和安全漏洞。
您的代码可以广泛应用于[SQL注入](http://en.wikipedia.org/wiki/SQL_injection)。 – Oded 2011-03-27 20:49:03