如何在预准备语句中正确使用通配符?

时间:2016-09-27 22:51:40

标签: c# sql-server prepared-statement

使用通配符的我的SQL预处理语句返回零记录。我发现的所有示例都不使用.Prepare()方法,该方法要求SqlParameter具有指定的类型。因此,当我将参数设置切换为使用.AddWithValue("@cid", cid+"%")时,Prepare()会抛出一个关于没有显式设置类型的异常。

ctx.Open();
string sql = "SELECT GRAD_COMMENCEMENT_DATE FROM GRADUATES WHERE GRADUATES_ID LIKE @cid";
SqlCommand query = new SqlCommand(sql,ctx);
SqlParameter id = new SqlParameter("@cid", SqlDbType.VarChar, 7);
id.Value = string.Format("{0}%", cid);
query.Parameters.Add(id);
//query.Prepare();
SqlDataReader rs = query.ExecuteReader();

string grad_date = "";
while (rs.Read())
{
  //no records =(
  grad_date = rs["GRAD_COMMENCEMENT_DATE"].ToString();
  Console.WriteLine("grad date: "+grad_date);
}
rs.Close();
ctx.Close();

3 个答案:

答案 0 :(得分:2)

更改后

id.Value = string.Format("{0}%", cid);

并删除

query.Prepare();

它将为您返回所有结果。 我在当地测试过,我不知道为什么你需要在这里做好准备?

答案 1 :(得分:0)

比特基础,但它有效:

使用预先设置的变量,填充它们,然后将它们传递给SQL Query函数。

string id = //value

void SQL Query(id)
{
    string idFilter = null;
    if (id != null)
        idFilter = "WHERE GRADUATES_ID LIKE @cid"
    else
        idFilter = String.Empty;

    conn.Open();

    string sql = "SELECT GRAD_COMMENCEMENT_DATE FROM GRADUATES " + idFilter;
    cmd = new SqlCommand(sql, ctx);

    if (id != null)
        cmd.Parameters.AddWithValue("@cid", id)
}

(为可怕的结构/可怕的语法道歉)

答案 2 :(得分:0)

为什么不喜欢这个?

string sql = "SELECT GRAD_COMMENCEMENT_DATE FROM GRADUATES WHERE GRADUATES_ID LIKE @cid + '%'";

@cid并非始终是varchar

string sql = @"SELECT GRAD_COMMENCEMENT_DATE 
FROM GRADUATES WHERE GRADUATES_ID LIKE CONVERT(VARCHAR,@cid) + '%'";