像子句和预备语句

本文关键字:语句 预备 子句 | 更新日期: 2023-09-27 17:51:05

我正在尝试使用准备好的语句与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());
                        }
                    }
                }
            }

Reader总是空的,我做错了什么

像子句和预备语句

由于您使用单引号,它将您的@pseudopart%部分视为字符串字面值,而不是参数。

这就是为什么你用@pseudopart%字符串过滤你的Field列,而不是pseudoPart变量的值。这就是为什么你的阅读器是空的。

用它来代替;

string Query = "SELECT TOP 10 Field FROM Table WHERE Field LIKE @pseudopart";
..
Command.Parameters.AddWithValue("@pseudopart", pseudoPart + "%");

顺便说一下,不要使用AddWithValue方法。它有时可能产生意想不到的结果。使用Add()方法重载来指定参数SqlDbType和它的大小。

我必须说,TABLE在T-SQL中是一个保留关键字。您应该将它与方括号一起使用,如[TABLE]。一些数据库管理器不考虑关键字大小写(Table - Table),但据我所知,SQL Server默认会考虑。

最好的选择是更改为non-reserved word.

您应该在您的参数中添加%, 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, "%"));