2

我目前最好的代码是:

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,最终我会得到十几个关于“无法将字符串转换为唯一标识符”的变体。我必须使用参数化查询来保证数据的清洁度,我只是不知道如何......

4

3 回答 3

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 注入是开放的。你需要确保你的Settings价值观是干净的。

于 2011-08-02T15:30:52.843 回答
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 执行。

于 2011-08-02T15:32:10.497 回答
0

您需要将字符串转换为 GUID:

相关线路:

SqlParameter key = new SqlParameter("keyuid", SqlDbType.UniqueIdentifier);
...
cmd.Parameters.Add(key).Value = new Guid(Page.Request["key"].ToString().Trim());

仅解决 GUID/UniqueIdentifer 问题

于 2011-08-02T15:30:10.010 回答