C# 使用变量恢复字符串SQL语句以使用它

C# 使用变量恢复字符串SQL语句以使用它,c#,sql-server,variables,C#,Sql Server,Variables,我有以下代码: SELECT * FROM table1 WHERE Type = 'Test type' AND Description = 'Number: " + row["Doc"].ToString() + "' AND State = 1 行[“Doc”].ToString()来自一个foreach循环,该循环在读取Doc字段的数据表上进行迭代 我的任务是将完整的句子像字符串一样存储在SQLServer表中,然后将其恢复。在这里我没有问题,但是当我想使用sencence时,

我有以下代码:

SELECT * 
FROM table1 
WHERE Type = 'Test type' 
AND Description = 'Number: " + row["Doc"].ToString() + "' 
AND State = 1
行[“Doc”].ToString()
来自一个foreach循环,该循环在读取
Doc
字段的数据表上进行迭代

我的任务是将完整的句子像字符串一样存储在SQLServer表中,然后将其恢复。在这里我没有问题,但是当我想使用sencence时,我的代码不能翻译真正的
行[“Doc”]。ToString()
数据,它像理解真正的字符串一样理解它,而我的SQL语句显然不起作用


为了更好地解释它,我需要执行这个句子,但它似乎是一个完整的字符串,没有变量。我不知道如何恢复变量并用它们的值替换它们。

很不清楚你在问什么,我在猜测

您的代码中有如下内容:

string theQuery = "SELECT * FROM table1 WHERE Type = 'Test type' AND Description = 'Number: " 
    + row["Doc"].ToString() + "' AND State = 1";
string storeQuery = "INSERT INTO sometable(query) VALUES('" + theQuery + "')";
然后你会在其他地方看到这样的东西:

string theQuery = "SELECT * FROM table1 WHERE Type = 'Test type' AND Description = 'Number: " 
    + row["Doc"].ToString() + "' AND State = 1";
string storeQuery = "INSERT INTO sometable(query) VALUES('" + theQuery + "')";
如果这是正确的,那么显然第二个查询将永远不会工作,因为它已经包含一些必须转义的字符,以便不破坏查询

为此,请使用一个查询参数,这意味着创建一个准备好的语句,该语句可以正确地转义所有参数,并解决部分SQL注入问题:

string storeQUery = "INSERT INTO sometable(query) VALUES(@param1)";

SqlCommand cmd = new SqlCommand(storeQUery, connection);
cmd.Parameters.AddWithValue("param1", theQuery);

另外,据您所知,手动连接SQL查询是您可以创建的最大安全漏洞之一,任何恶意用户都可以执行SQL注入攻击。

非常不清楚您在问什么,我试图猜测

您的代码中有如下内容:

string theQuery = "SELECT * FROM table1 WHERE Type = 'Test type' AND Description = 'Number: " 
    + row["Doc"].ToString() + "' AND State = 1";
string storeQuery = "INSERT INTO sometable(query) VALUES('" + theQuery + "')";
然后你会在其他地方看到这样的东西:

string theQuery = "SELECT * FROM table1 WHERE Type = 'Test type' AND Description = 'Number: " 
    + row["Doc"].ToString() + "' AND State = 1";
string storeQuery = "INSERT INTO sometable(query) VALUES('" + theQuery + "')";
如果这是正确的,那么显然第二个查询将永远不会工作,因为它已经包含一些必须转义的字符,以便不破坏查询

为此,请使用一个查询参数,这意味着创建一个准备好的语句,该语句可以正确地转义所有参数,并解决部分SQL注入问题:

string storeQUery = "INSERT INTO sometable(query) VALUES(@param1)";

SqlCommand cmd = new SqlCommand(storeQUery, connection);
cmd.Parameters.AddWithValue("param1", theQuery);

另外,据您所知,手动连接SQL查询是您可以创建的最大安全漏洞之一,任何恶意用户都可以执行SQL注入攻击。

请添加更多代码以了解上下文。抱歉,我将重试。如果我想存储查询:‘“SELECT*FROM TABLE1,其中ID=“+variable1”,其中‘varable1’从上下文获取其值,我可以将所有查询保存在一个nvarchar(MAX)字段(例如)中,或者将查询分为两个字段,将‘variable1’保存在第二个nvarchar(30)字段中。当我恢复查询时,variable1被恢复为字符串,代码理解字符串“SELECT*fromtable1,其中TABLE1.ID=+variable1”。事实上,我不知道如何使“variable1”一词被理解为变量,而不是字符串。请添加更多代码以理解上下文。抱歉,我将重试。如果我想存储查询:‘“SELECT*FROM TABLE1,其中ID=“+variable1”,其中‘varable1’从上下文获取其值,我可以将所有查询保存在一个nvarchar(MAX)字段(例如)中,或者将查询分为两个字段,将‘variable1’保存在第二个nvarchar(30)字段中。当我恢复查询时,variable1被恢复为字符串,代码理解字符串“SELECT*fromtable1,其中TABLE1.ID=+variable1”。事实上,我不知道如何使“variable1”一词被理解为变量,而不是字符串。
AddNamedParameterWithValue
?这是MySql连接器的一种新方法吗?(顺便提一下,问题被标记为Sql Server)@Steve ehm,不,它不是新的,它是ado mysql命令的一部分,是的,它必须是Sql,让我改变它(我读了“我的Sql”的描述,我的头刚刚加入了tham:D)也许我的Intellisense坏了,但我在MySqlCommand类(版本6.3.6.0)上找不到任何同名的方法@Steve hell,这就是从内存中编写代码时发生的情况,更正为.Parameters.AddWithValue:P
AddNamedParameterWithValue
?这是MySql连接器的一种新方法吗?(顺便提一下,问题被标记为Sql Server)@Steve ehm,不,它不是新的,它是ado mysql命令的一部分,是的,它必须是Sql,让我改变它(我读了“我的Sql”的描述,我的头刚刚加入了tham:D)也许我的Intellisense坏了,但我在MySqlCommand类(版本6.3.6.0)上找不到任何同名的方法@Steve hell,这就是从内存中编写代码时发生的情况,更正为.Parameters.AddWithValue:P