Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在参数化查询中传递guid?_C#_Guid_Parameterized Query - Fatal编程技术网

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

C# 如何在参数化查询中传递guid?,c#,guid,parameterized-query,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 S

我目前最好的代码是:

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”上得到了十几个变体。我必须使用参数化查询来保证数据的清洁度,我真的很纠结于……

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

相关线路:

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

这只解决了GUID/UniqueIdentifer问题

您不能为列名指定参数-您需要以与表名相同的方式连接它

这:

应改为:

"DELETE FROM " + Settings.DataSource + " WHERE " + Settings.KeyColumn + " =@keyuid"
尽管我可能会这样写:

string delNonQuery = string.Format("DELETE FROM {0} WHERE {1} = @keyuid", 
                                   Settings.DataSource, 
                                   Settings.KeyColumn);


为了完整性起见,我将提到这是开放的。你需要确保你的
设置
值是干净的。

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

我这样做了。转换失败。感谢大家对SQL注入的关注。我应该指出,唯一能够将SQL注入的人是使用它来自的服务器端控件的人。因为这基本上需要他们SQL注入一个数据源,他们大概有管理员权限,我想这是最小的。另一方面,密钥ID。。。这就是为什么它是参数化的。谢谢你。工作完美。string.Format对此有什么好处?将guid字符串值作为“SqlDbType.NVarChar”而不是“SqlDbType.UniqueItentifier”传递对我来说也很有用+是的,就是这样。使用string.Format有什么好处?@One Monkey-可读性和易于维护。我不想成为一个痛苦的人,但很抱歉我不明白。可读性是没有意义的,任何人都可能理解原文,但是花括号需要一些领域知识,如果你理解了惯例,它确实会使阅读查询变得更加流畅。我真的不明白为什么一个比另一个更容易维护?“我不是想惹人烦,我只是真的不明白。”“一只猴子——例如,当你需要添加或删除一个参数时。”。我个人觉得格式字符串比长串接字符串更可读。好吧,我明白了。这个例子可能不是最好的,因为它已经完成了,但我确实遇到过它有点失控的情况。
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();