如何在参数化查询中传递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"的十几个变体。我必须使用参数化查询来保持数据整洁,我只是真的卡住了如何…
您不能为列名指定参数—您需要像连接表名一样将其连接起来。
:
"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问题