【发布时间】:2016-09-28 07:55:56
【问题描述】:
我的使用通配符的 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();
【问题讨论】:
-
id.Value = string.Format("{0}%", cid);
-
Hello SQL 注入
-
@BrendanGreen 在准备好的声明中?
-
@TonyDong 这并没有解决问题,我仍然得到零记录。我认为这不起作用,因为 sql 必须在值周围加上单引号。 sql 最终需要看起来像:
SELECT GRAD_COMMENCEMENT_DATE FROM GRADUATES WHERE GRADUATES_ID LIKE '0123456%' -
Tony Dong 是对的,该值必须是不带引号的字符串。尝试使用
=而不是LIKE,看看你会得到什么。一次解决问题,而不是一次解决多个步骤。
标签: c# sql-server prepared-statement