如何在参数化查询中传递guid?

时间:2011-08-02 15:26:10

标签: c# guid parameterized-query

我目前最好的代码是:

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”的十几个变体。我必须使用参数化查询来保证数据的清洁度,我真的不知道如何......

3 个答案:

答案 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问题