我遇到以下问题::
我想逃避以下角色'单引号:
通过以下方式进行此测试时有效:内置方法Replace("'","''");
如下面的代码:(只是一个测试)它的工作原理
protected void btn_insert_Click(object sender, EventArgs e)
{
lbl.Text = string.Empty;
SqlConnection mycon = new SqlConnection(Constr);`
SqlCommand mycommand = new SqlCommand("INSERT INTO details VALUES('" + txt.Text.Replace("'", "''") + "','" + txt.Text.Replace("'", "''")+ "')", mycon);
mycon.Open();
int affectedRows = 0;
affectedRows = mycommand.ExecuteNonQuery();
mycon.Close();
}
但我想通过数据访问层中的Insert方法推广我的解决方案以在整个应用程序中工作:
public static int InsertEntity(string tblName, Dictionary<string, string> dtParams)
{
int Result = -1;
DBConnection DAL_Helper = new DBConnection("");
string[] field_names = new string[dtParams.Count];
dtParams.Keys.CopyTo(field_names, 0);
string[] field_values = new string[dtParams.Count];
dtParams.Values.CopyTo(field_values, 0);
for (int i = 0; i < field_values.Length; i++)
{
field_values[i].Replace("'", "''");
}
string insertCmd = "INSERT INTO " + tblName + " (" + string.Join(",", field_names) + ") values ('" + string.Join("','", field_values) + "')";
Result = DAL_Helper.Execute_NonQuery(insertCmd);
return Result;
}
虽然我使用Replace("'","''");
问题是什么,如何解决这个问题?
答案 0 :(得分:5)
我强烈建议您使用Command Parameters
集合而不是您的方法来使用SqlCommand.Parameters
。
问题出在这里:
for (int i = 0; i < field_values.Length; i++)
{
field_values[i].Replace("'", "''");
}
将其替换为:
for (int i = 0; i < field_values.Length; i++)
{
field_values[i] = field_values[i].Replace("'", "''");
}
答案 1 :(得分:3)
以decyclone的答案为基础。 CommandParameters是这里的方法,您只需使用自己的代码重新创建它。
我在这里找到了一个非常好的明确示例,用于向SQL语句提供params。
http://dotnetperls.com/sqlparameter
using (SqlCommand command = new SqlCommand("SELECT * FROM Dogs1 WHERE Name LIKE @Name", connection))
{
string dogName = "Mc'Dougal";
//
// Add new SqlParameter to the command.
//
command.Parameters.Add(new SqlParameter("Name", dogName));
//
// Read in the SELECT results.
//
SqlDataReader reader = command.ExecuteReader();
}