6

我有由(')引号组成的字符串,例如“母爱”......

通过 c# 中的 sql 查询插入数据时。它显示错误。如何纠正问题并成功插入此类数据?

string str2 = "Insert into tblDesEmpOthDetails (EmpID, Interviewnotes) values ('" + EmpId + "','" + Interviewnotes + "')";

采访笔记包含诸如“母爱”之类的值(带单引号)。执行此查询时,它显示错误为“字符串') 后的未闭合引号”我如何插入这种类型的字符串?

4

6 回答 6

22

我很确定您不使用 SQL 参数:

using (SqlCommand myCommand = new SqlCommand(
    "INSERT INTO table (text1, text2) VALUES (@text1, @text2)")) {

    myCommand.Parameters.AddWithValue("@text1", "mother's love");
    myCommand.Parameters.AddWithValue("@text2", "father's love");
    //...

    myConnection.Open();
    myCommand.ExecuteNonQuery();
    //...
}
于 2012-06-20T13:03:42.433 回答
14

使用命名参数和 SqlParameter。

来自http://www.dotnetperls.com/sqlparameter

class Program
{
    static void Main()
    {
        string dogName = "Fido";  // The name we are trying to match.

        // Use preset string for connection and open it.
        string connectionString = 
            ConsoleApplication1.Properties.Settings.Default.ConnectionString;

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            // Description of SQL command:
            // 1. It selects all cells from rows matching the name.
            // 2. It uses LIKE operator because Name is a Text field.
            // 3. @Name must be added as a new SqlParameter.
            using (SqlCommand command = 
               new SqlCommand("SELECT * FROM Dogs1 WHERE Name LIKE @Name", connection))
            {
                // Add new SqlParameter to the command.
                command.Parameters.Add(new SqlParameter("Name", dogName));

                // Read in the SELECT results.
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    int weight = reader.GetInt32(0);
                    string name = reader.GetString(1);
                    string breed = reader.GetString(2);
                    Console.WriteLine("Weight = {0}, Name = {1}, Breed = {2}", weight, name, breed);
                }
            }
        }
    }
}
于 2012-06-20T13:02:21.183 回答
6

虽然,您可以用两个 ' 字符 ('') 替换字符串中的所有 ' 字符,但这不是一个好主意。由于这个问题和许多其他原因(例如避免 SQL 注入攻击),您绝对应该使用命名参数,而不是通过将值直接连接到字符串中来将值添加到您的插入语句中。例如:

command.CommandText = "Insert into tblDesEmpOthDetails (EmpID, Interviewnotes) values (@EmpId, @Interviewnotes)";
command.Parameters.AddWithValue("EmpId", EmpId);
command.Parameters.AddWithValue("Interviewnotes", Interviewnotes);
于 2012-06-20T13:03:01.287 回答
2

将此行添加到您尝试输入的字符串中

说你的字符串是

string test = "that's not working correctly"
test = replace(Request.QueryString(test), "'", "''")

然后测试现在

"that''s not working correctly"

这在 SQL 的语法上是正确的

问候

于 2012-06-20T13:08:26.890 回答
2

作为(非常正确地)指向参数的答案的变体:如果这看起来需要做很多工作,那么请使用诸如dapper之类的工具来避免它

int empId = 123;
string notes = "abc";
connection.Execute(@"insert into tblDesEmpOthDetails (EmpID, Interviewnotes)
                     values (@empId, @notes)", new {empId, notes});

Dapper 将自动获取empIdand notes(来自匿名对象)并将它们添加为命名/类型参数。类似Query/Query<T>扩展方法还允许直接对对象模型进行简单且高度优化的查询。

于 2012-06-20T13:24:37.040 回答
1

您需要使用双 ''

INSERT INTO something (Name) VALUES ('O''something''s')

这将插入 O'something's。我读到的另一个例子是:

假设我们有一个字符串:

SQL = "SELECT * FROM name WHERE LastName='" & LastName & "' "

如果我们有 O'Brian、O'Reily 等姓氏,我们会得到类似的字符串

SELECT * FROM name WHERE LastName='O'Brien'

第二个 ' 将结束 SQL 语句。所以这里最简单的解决方案是使用双 '' 然后我们将有这样的字符串:

SELECT * FROM name WHERE LastName='O''Brien'
于 2012-06-20T13:04:39.810 回答