我正在尝试使用预备语句来生成带有LIKE子句的SQL请求。
以下是代码:
using (SqlConnection Connection = new SqlConnection(ConnectionString))
{
Connection.Open();
string Query = "SELECT TOP 10 Field FROM Table WHERE Field LIKE '@pseudopart%'";
using (SqlCommand Command = new SqlCommand(Query, Connection))
{
Command.Parameters.AddWithValue("@pseudopart", pseudoPart);
using (SqlDataReader Reader = Command.ExecuteReader())
{
if (!Reader.HasRows)
return PossibleMatch;
while (Reader.Read())
{
PossibleMatch.Add(Reader["Field"].ToString());
}
}
}
}
读者永远是空的,我做错了什么?
答案 0 :(得分:5)
由于您使用单引号,因此它会将您的@pseudopart%
部分视为string literal,而不是参数。
这就是您使用Field
字符串过滤@pseudopart%
列的原因,而不是pseudoPart
变量的值。这就是为什么你的读者是空的。
使用它代替;
string Query = "SELECT TOP 10 Field FROM Table WHERE Field LIKE @pseudopart";
..
Command.Parameters.AddWithValue("@pseudopart", pseudoPart + "%");
顺便说一下,不要使用AddWithValue
方法。 It may generate unexpected results sometimes。使用Add()
method overloads指定参数SqlDbType
及其大小。
我必须说,TABLE
在T-SQL中是reserved keyword。您应该使用方括号(如[TABLE]
)。一些数据库管理员不考虑关键字案例(表 - 表),但据我所知,SQL Server默认考虑它。
最佳选择是将其更改为非 - 保留字。
答案 1 :(得分:0)
您应该在参数中添加%
,ado.net提供程序将在您的SQL查询中为您解决,示例:
string Query = "SELECT TOP 10 Field FROM Table WHERE Field LIKE @pseudopart";
using (SqlCommand Command = new SqlCommand(Query, Connection))
{
Command.Parameters.AddWithValue("@pseudopart", string.Concat(pseudoPart, "%"));