在SQL查询中转义单引号c#

cha*_*ind 2 c# sql sql-server

这里我在我的CandidateOp类文件中有这个方法.

public SqlDataReader getpartyID(string partyName)
{
    string query = "EXEC partyIDtoInsert'" +partyName+ "'";
    return new DataAccessLayer().executeQuerys(query);
}
Run Code Online (Sandbox Code Playgroud)

我正在传递ComboBox表单中的文本,我得到ID整数类型变量tempPrID.

SqlDataReader reader02 = new CandidateOP().getpartyID(cmbParty.Text);
if (reader02.HasRows)
{
    while (reader02.Read())
    {
         tempPrID = (Int32)reader02[0];
    }
    reader02.Close();
}
else
{
    MessageBox.Show("Please enter a valid Party Name", "Invalid DATA");
} 
Run Code Online (Sandbox Code Playgroud)

partyIDtoInsert是我创建的一个存储过程,它正在getpartyID如前所示的方法中被调用,以获得联合国家党的身份.

EXEC partyIDtoInsert 'United National Party'; 
Run Code Online (Sandbox Code Playgroud)

如果我有一个名为"United People's Freedom Alliance"的聚会名称,那么如果我想插入该名称,我的存储过程执行代码就像这样.

EXEC partyIDtoInsert 'United People's Freedom Alliance';
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它将结束点视为People的单引号并返回sql异常.

如何在语句中转义此单引号问题以执行我的存储过程.

小智 6

只需用双引号替换单引号('),如''.

所以你的功能看起来像:

public SqlDataReader getpartyID(string partyName)
            {
                string query = "EXEC partyIDtoInsert'" +partyName.Replace("'", "''") + "'";
                return new DataAccessLayer().executeQuerys(query);
             }
Run Code Online (Sandbox Code Playgroud)

我希望它能解决你的问题.:)

  • 反对投票,因为没有解释反对票。尽管此方法对 SQL 注入是开放的,但它不必被否决。 (2认同)
  • SQL 参数应始终参数化。这个答案是一种缺乏经验的黑客解决方法,它会延续不良的编程实践,并增加 SQL 注入的风险。仅仅因为它有效,并不意味着它是正确的。现在,这里的其他人会将此视为最佳答案,并且可能不会在下面进一步查看 @mybirthname 的关于应该如何完成的答案。 (2认同)

myb*_*ame 5

首先,您应该使用SqlParameters避免sql注入

string query = "EXEC partyIDtoInsert @PartyName";
Run Code Online (Sandbox Code Playgroud)

您在哪里执行查询

SqlCommand cmd = new SqlCommand(query, connection);
cmd.Parameters.AddWithValue("@PartyName", partyName);
Run Code Online (Sandbox Code Playgroud)

否则,问题在于partyIDtoInsert与“美国人民自由联盟”之间没有“”。如果您想继续使用,请向"EXEC partyIDtoInsert '"我发送这样的邮件。但这是错误的!了解有关sql Injection的信息!