我目前最好的代码是:
string delNonQuery = "DELETE FROM " + Settings.DataSource + " WHERE @keycolumn=@keyuid";
SqlCommand cmd = new SqlCommand(delNonQuery,readerConn);
SqlParameter kc = new SqlParameter("keycolumn", SqlDbType.VarChar);
SqlParameter key = new SqlParameter("keyuid", SqlDbType.VarChar);
cmd.Parameters.Add(kc).Value = Settings.KeyColumn;
cmd.Parameters.Add(key).Value = Page.Request["key"].ToString().Trim();
readerConn.Open();
cmd.ExecuteScalar();
readerConn.Close();
这会执行但会影响高达零的行。如果我将keyuid上的SqlDbType更改为UniqueIdentifier,它最终会让我得到“未能将字符串转换为uniqueidentifier”的十几个变体。我必须使用参数化查询来保证数据的清洁度,我真的不知道如何......
答案 0 :(得分:2)
您无法为列名指定参数 - 您需要以与表名相同的方式连接它。
此:
"DELETE FROM " + Settings.DataSource + " WHERE @keycolumn=@keyuid"
应改为:
"DELETE FROM " + Settings.DataSource + " WHERE " + Settings.KeyColumn + " =@keyuid"
虽然我可能会把它写成:
string delNonQuery = string.Format("DELETE FROM {0} WHERE {1} = @keyuid",
Settings.DataSource,
Settings.KeyColumn);
为了完整起见,我会提到SQL injection这是开放的。您需要确保Settings
值是干净的。
答案 1 :(得分:2)
我认为你不能参数化列名(“keycolumn”)
试试这个:
string delNonQuery = string.Format("DELETE FROM " + Settings.DataSource + " WHERE {0}=@keyuid", Settings.KeyColumn);
SqlCommand cmd = new SqlCommand(delNonQuery,readerConn);
SqlParameter key = new SqlParameter("keyuid", SqlDbType.VarChar);
cmd.Parameters.Add(key).Value = Page.Request["key"].ToString().Trim();
readerConn.Open();
cmd.ExecuteScalar();
readerConn.Close();
关于连接字符串以构建SQL,通常会发出警告;这可能存在安全隐患。
最好的方法可能是将SQL封装在存储过程中,将列名和值作为参数传递,然后使用动态SQL执行。
答案 2 :(得分:0)
您需要将字符串转换为GUID:
相关行:
SqlParameter key = new SqlParameter("keyuid", SqlDbType.UniqueIdentifier);
...
cmd.Parameters.Add(key).Value = new Guid(Page.Request["key"].ToString().Trim());
仅解决了GUID / UniqueIdentifer问题