sql - 嵌入字段中的单引号 _'_ 会阻止成功的 SQL 查询

标签 sql c ms-access

我使用的商业数据库提供了以下字段:

Super Crew 5 1/2' Bed 4WD  // where single quote (') symbolizes feet

当需要在 SQL 查询中使用此字段时,它会展开类似于以下摘录:

...WHERE TitleIndex.Title='Super Crew 5 1/2' Bed 4WD'

导致错误消息查询表达式缺少运算符。预期的字符串文字部分 >>> Bed 4WD'<<< 由于其前面的单引号而无法理解。

注意:如果我手动编辑数据库字段以将 >'< 替换为 >ft.<:

'Super Crew 5 1/2ft. Bed 4WD' 

查询有效。但是每次交付新数据库时都编辑所有包含单引号的字段是不切实际的。

我查看了参数化,但这将不起作用,因为该字段仍需要使用另一个单引号对嵌入该字段的单引号进行转义:

SET @Value = 'Super Crew 5 1/2'' Bed 4WD'

同样,这需要编辑,这对我们来说不是一个选项。

由于我无法转义提供字段中嵌入的单引号,有没有办法将其打包到查询字符串中,这样它就不会被拒绝为非法查询?

EDIT(显示功能问题存在)

请注意,在下面的代码中,char *title 是在之前的调用中获得的,它包含与存储在数据库中一样的列数据。 >>>Super Crew 5 1/2' Bed 4WD<<<

int AMSDB_API ams_get_tid_from_title(char *title, int *titleId)
{
    int index, status, iStatus, tid;
    char query[500];

    sprintf (query, "SELECT TitleIndex.TitleId FROM TitleIndex WHERE TitleIndex.Title=\'%s\'", title);
    hstmt = DBActivateSQL(hAmsIndex, query);

    //numberRecords = DBNumberOfRecords(hstmt); 

    status = DBBindColInt (hstmt, 1, &tid, &iStatus);
    DBFetchNext(hstmt);
    DBDeactivateSQL(hstmt);
    *titleId = tid;

    return status;
}

最佳答案

如您所知,要在查询字符串中使用单引号,需要使用另一个单引号对其进行转义。

作为最简单/最快实现的解决方案,您可以在 C 函数中“转义”标题字符串。您将搜索字符串(标题)作为 char * 的引用,使用此字符串引用,您可以找到任何单引号并用另一个单引号将它们转义。然后在您的查询中使用这个修改后的字符串。

抱歉,我不提供代码,C 不是我的强项。

关于sql - 嵌入字段中的单引号 _'_ 会阻止成功的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25122914/

相关文章:

c# - 从 C# 读取 Access 2007 (accdb) 文件的性能真的很慢

sql - 如何确定 COALESCE 运算符成功选择了哪一列/值?

c - 为什么 ICC 在 x86 上的汇编中生成 "inc"而不是 "add"?

c - 将两个 C 结构打包成一个 uint8_t 指针以写入 DataFlash

从 MDB 到 WebApp 的 Java 集成

sql - 在VBA中引用查询结果,也许可以使用SQL?

sql - 将数组从 jsonb_array_elements_text() 转换为整数数组

mysql - 在 WHERE 子句中使用列别名

sql - 如何在 'invoke-SQLcmd' 语句中使用 PowerShell 的 'if' 的结果?

c - GLFW 一切都在使用 GL_LINEAR