使用通配符的我的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();
答案 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) + '%'";