MS SQL Server 中单引号的两种处理方法

白榆
白榆
发布时间:2026-10-14| 3人浏览过
原创

在 MS SQL Server 开发中,当查询变量包含单引号时易引发语法错误。本文介绍两种解决方案:一是使用自定义函数对字符串进行转义处理;二是利用 ADODB.Command 对象的参数化特性传递数据。对比表明,参数化方法不仅代码简洁,且能有效预防注入风险并提升执行效率,尤其配合存储过程使用时效果更佳。

问题背景

在进行数据库交互时,通常不建议完全依赖控件绑定方式,因为其灵活性差、效率低且功能受限。大多数程序员采用非绑定的 SQL 语句拼接方式,但这种方式容易忽略单引号的特殊处理。当 SQL 查询条件的变量中包含单引号(如英文名 "Paolo'f")时,数据库引擎会因 SQL 语法错误而报错。

解决方法一:利用转义字符处理

该方法的核心是在执行 SQL 语句前,通过程序逻辑检测字符串中的单引号,并在其前追加一个单引号进行转义。以下 VB6/VBA 函数可实现此功能:

复制代码 代码如下:
Function ProcessStr(str As String) Dim pos As Integer Dim stedest As String pos = InStr(str, "'") While pos > 0 str = Mid(str, 1, pos) & "'" & Mid(str, pos + 1) pos = InStr(pos + 2, str, "'") Wend ProcessStr = str End Function

在使用时,将待处理的 SQL 字符串传入该函数,系统会自动替换其中的单引号为双单引号,从而生成合法的 SQL 语法。虽然这种方法直观易懂,但它增加了系统的字符串处理开销,且在拼接长字符串时容易出错。

解决方法二:利用 ADODB.Command 对象参数

更为推荐的方法是利用 ADODB.Command 对象的数据参数化功能。通过将含有单引号的字符串作为参数传递给命令对象,可以避免手动拼接 SQL 语句带来的语法和安全隐患。如果结合预编译的存储过程使用,系统将具有更高的执行效率。

第1步:环境准备与对象声明

首先,需要在项目中引入相关引用,并声明连接对象、命令对象及记录集。以下是窗体通用部分的变量声明及初始化代码:

Dim cnn1 As ADODB.Connection '连接对象
Dim mycommand As ADODB.Command '命令对象
Dim rstByQuery As ADODB.Recordset '结果集
Dim strCnn As String '连接字符串

Private Sub Form_Load()
    Set cnn1 = New ADODB.Connection '生成连接对象
    '示例连接字符串,请根据实际环境修改
    strCnn = "driver={SQL Server};server=ZYX_pc;uid=sa;pwd=PCDC;database=pubs"
    '若配置了ODBC数据源,也可使用: strCnn = "DSN=mydsn;UID=sa;PWD=;DATABASE=pubs;Driver={SQL Server};SERVER=gzl_pc"
    cnn1.Open strCnn, , , 0 '打开连接
End Sub

第2步:使用参数化查询执行操作

在执行查询或更新前,创建 ADODB.Parameter 对象,设置其类型、大小、方向及值,并将其追加到 Command 对象的参数集合中。SQL 语句中使用占位符 ?。

以下为使用参数化方法(Command2按钮事件)的典型代码逻辑:

Private Sub Command2_Click()
    Dim i As Integer, j As Integer
    Set parm = New ADODB.Parameter
    Set mycommand = New ADODB.Command
    
    ' 设置参数属性
    parm.Type = adChar ' 参数类型
    parm.Size = 10     ' 参数长度
    parm.Direction = adParamInput ' 输入方向
    parm.Value = Combo1.Text      ' 从下拉框获取可能含单引号的值
    
    mycommand.Parameters.Append parm ' 添加参数
    mycommand.ActiveConnection = cnn1 ' 指定活动连接
    mycommand.CommandText = "select * from employee where fname=?" ' 使用占位符
    mycommand.CommandType = adCmdText
    
    Set rstByQuery = New ADODB.Recordset
    Set rstByQuery = mycommand.Execute() ' 执行查询
    
    ' 此处省略填充 MSFlexGrid1 的代码,逻辑同常规记录集遍历
End Sub

注意:对于 INSERT、DELETE、UPDATE 等操作,方法类似,只需修改 CommandText 中的 SQL 语句即可。为了进一步提高效率并降低网络流量,建议将复杂的查询逻辑封装为 SQL Server 存储过程,并通过参数将数据传递给存储过程执行。

测试环境与数据准备

本方案在 NT WORKSTATION 4.0 SP4 与 SQL SERVER 7.0 环境下调试通过。为了验证处理效果,可以使用 PUBS 数据库中的 EMPLOYEE 表。可以通过以下 SQL 语句在表中插入包含单引号的测试数据:

update employee set fname='Paolo''f' where emp_id='PMA42628M'
update employee set fname='Paolo'f' where emp_id='PMA42628M'

随后在前端界面(如 COMBO1)中选择包含单引号的名称,分别调用字符处理函数和参数化查询方法,观察查询结果是否准确返回对应记录。

总结

处理 SQL Server 中单引号问题,传统的转义字符法虽简单但存在性能与安全劣势;利用 ADODB.Command 对象进行参数化处理则是更优解,它不仅简化了代码结构,还从根本上避免了因特殊字符导致的语法错误及 SQL 注入风险。

以上就是 MS SQL Server 中单引号的两种处理方法的详细内容,更多关于 SQL Server 开发技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。