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

本文关键字:guid 查询 参数 | 更新日期: 2023-09-27 18:04:11

我目前最好的代码是:

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();

执行,但影响的行数为零。如果我将keyid上的SqlDbType更改为UniqueIdentifier,那么我最终会得到"未能将字符串转换为UniqueIdentifier"的十几个变体。我必须使用参数化查询来保持数据整洁,我只是真的卡住了如何…

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

您不能为列名指定参数—您需要像连接表名一样将其连接起来。

:

"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值是干净的。

我不认为你可以参数化列名("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执行。

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

相关行:

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

只解决GUID/uniqueidentifier问题