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

时间:2014-08-04 16:05:16

标签: 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'

导致错误消息查询表达式缺少运算符。预期字符串文字的部分>>>床4WD'<<<因为前面的单引号而被理解。

注意 :如果我手动编辑数据库字段以替换>'<使用> ft。<:

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

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

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

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

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

由于我无法转义嵌入在提供的字段中的单引号,有没有办法可以将它打包成查询字符串,以便它不会被拒绝作为非法查询?

编辑 (显示存在功能问题)

注意,在下面的代码中,char *title是在前一次调用中获得的,它包含列数据,就像它存储在数据库中一样。 &gt;&gt;&gt; Super Crew 5 1/2&#39;床4WD <&lt;&lt;

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;
}

2 个答案:

答案 0 :(得分:2)

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

作为最简单/最快速的实施解决方案,您可以逃避&#34; C函数中的标题字符串。您可以将搜索字符串(标题)引用为char *,使用此字符串引用可以找到任何单引号,并使用另一个单引号将其转义。然后在查询中使用此修改后的字符串。

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

答案 1 :(得分:0)

好的,我看到这是MS-Access,是的,Access确实使得进行正确的SQL参数化变得非常困难。 Microsoft doc确实解释了它:http://msdn.microsoft.com/en-us/library/dd671279(v=office.12).aspx

简而言之,您需要将变量值放入全局或模块级变量中。

Public pstrParameter1 As String

然后你必须编写一个公开可见的VBA函数,它将返回该全局/模块变量的值。

Public Function Parmeter1Value() As String
    Parmeter1Value = pstrParmeter1
End Function

最后,您的Access SQL查询必须调用该函数以向SQL提供变量值。

...WHERE TitleIndex.Title=Parameter1Value()

Kludgy,但那就是MS-Acces for you。