喜欢条款和准备好的声明

时间:2015-05-29 13:55:54

标签: c# sql

我正在尝试使用预备语句来生成带有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());
                        }
                    }
                }
            }

读者永远是空的,我做错了什么?

2 个答案:

答案 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, "%"));