我在CandidateOp
类文件中有这个方法。
public SqlDataReader getpartyID(string partyName)
{
string query = "EXEC partyIDtoInsert'" +partyName+ "'";
return new DataAccessLayer().executeQuerys(query);
}
我正在表单中传递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");
}
partyIDtoInsert
是我创建的存储过程,如前所示,它在方法getpartyID
中被调用,以获得联合国家党的身份。
EXEC partyIDtoInsert 'United National Party';
如果我有一个名为“United People's Freedom Alliance”的聚会名称,那么如果我想插入该名称,我的存储过程执行代码就像这样。
EXEC partyIDtoInsert 'United People's Freedom Alliance';
在这种情况下,它将结束点视为People的单引号并返回sql异常。
如何在语句中转义此单引号问题以执行我的存储过程。
答案 0 :(得分:6)
只需用双引号替换单引号('),如''。
所以你的功能如下:
public SqlDataReader getpartyID(string partyName)
{
string query = "EXEC partyIDtoInsert'" +partyName.Replace("'", "''") + "'";
return new DataAccessLayer().executeQuerys(query);
}
我希望它能解决你的问题。 :)
答案 1 :(得分:4)
首先你应该使用SqlParameters来避免sql Injection
string query = "EXEC partyIDtoInsert @PartyName";
您要求查询的地方
SqlCommand cmd = new SqlCommand(query, connection);
cmd.Parameters.AddWithValue("@PartyName", partyName);
否则问题是你在partyIDtoInsert和'United People's Freedom Alliance'之间没有“”。如果你想继续使用"EXEC partyIDtoInsert '"
像这样对我说。但这是错的!阅读sql Injection!
答案 2 :(得分:1)
由于Hitesh Mistry提供了这样的答案,它对我有用。
public SqlDataReader getpartyID(string partyName)
{
string query = "EXEC partyIDtoInsert'" +partyName.Replace("'", "''") + "'";
return new DataAccessLayer().executeQuerys(query);
}
我想要一些人来解释如何使用sql参数。因为我想以这种方式实施它。 我没有得到sql参数提供的答案,因为它处理连接。我在这个名为DBconnect的单独类中使用连接。它是从另一个名为DataAccessLayer的类中调用的。
这就是我在DBConnect中使用连接的方式。
public static string makeConnection()
{
string con = ConfigurationManager.ConnectionStrings["MyDb.Properties.Settings.ConString"].ToString();
return con;
}
答案 3 :(得分:0)
尝试EXEC partyIDtoInsert 'United People''s Freedom Alliance';
答案 4 :(得分:0)
我已经做了类似的事情,但没有任何异常。
partyName.Replace("'", $"{(char)39}");