我使用的商业数据库包含以下字段:
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;
}
答案 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。