C# 向数据库插入带单引号的字符串:一个Replace就能搞定,但99%的人用错过
2026/6/11 9:23:52 网站建设 项目流程

问题分析

字符串中包含单引号直接拼接到 SQL 语句会导致语法错误,因为单引号在 SQL 中被视为字符串边界符。例如:

INSERT INTO table (text) VALUES ('It's a good day') -- 语法错误:单引号提前闭合

解决方案一:转义单引号

SQL 标准规定通过双写单引号转义:

It's a good day → It''s a good day

代码实现(C#)

string name = "It's a good day"; string safeName = name.Replace("'", "''"); string sql = $"INSERT INTO article (title) VALUES ('{safeName}')";

注意

  • 直接调用Replace("'", "''")会生成新字符串,需赋值给变量。
  • 避免无效写法:str.Replace(...)不修改原字符串(因字符串不可变)。

解决方案二:参数化查询(推荐)

通过参数化自动处理特殊字符,同时防止 SQL 注入。

ADO.NET(SQL Server)示例

string sql = "INSERT INTO article (title) VALUES (@title)"; using (SqlCommand cmd = new SqlCommand(sql, connection)) { cmd.Parameters.AddWithValue("@title", "It's a good day"); cmd.ExecuteNonQuery(); }

OleDb(Access 等)示例

string sql = "INSERT INTO article (title) VALUES (?)"; using (OleDbCommand cmd = new OleDbCommand(sql, connection)) { cmd.Parameters.AddWithValue("?", "It's a good day"); cmd.ExecuteNonQuery(); }

方案对比

方法优点缺点
单引号转义简单,兼容所有数据库仅处理单引号,仍有注入风险
参数化查询安全,自动处理所有特殊字符代码量略多,需依赖数据库驱动

最佳实践

  • 临时脚本/可控数据:使用Replace("'", "''")快速修复。
  • 生产环境/用户输入:强制使用参数化查询。

完整参数化示例

public bool InsertData(string title, string content) { string sql = "INSERT INTO article (title, content) VALUES (@title, @content)"; using (var conn = new SqlConnection(connectionString)) using (var cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@title", title); cmd.Parameters.AddWithValue("@content", content); conn.Open(); return cmd.ExecuteNonQuery() > 0; } }

总结

  • 转义单引号是临时解决方案,参数化查询是终极安全实践。
  • 参数化查询同时解决特殊字符和 SQL 注入问题,应作为首选。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询