在SQL查询中使用哪些字符要小心?

时间:2017-08-29 17:49:17

标签: sql excel excel-vba vba

我正在处理一个SQL查询,它将数据库中的信息提取到Excel中。但是,源是来自网站,所以我无法控制他们使用的字符。我无法编辑表格中的字段。

我遇到一个问题,网站有时会在字段中使用'字符,这会导致我的代码出现问题:

示例字段:“Something's Here”

WHERE(Table.fieldName ='Something's Here')

'导致错误,但我知道在这种情况下我可以通过VBA更改'到''。

是否还有其他可能导致问题的角色?也许(或)或 - 或,

编辑:请注意我不懂PHP,并且不太了解准备好的声明是什么,或者在我的情况下是否有效。重申一下,我使用Excel通过ODBC连接导入数据。它们存储在Excel中的表格中。用户输入一个数字,然后通过VBA更新ODBC连接。根据用户输入的有时具有不允许的字符的数字,存在相关字段(用户未输入)。我不知道准备好的声明能解决这个问题。

1 个答案:

答案 0 :(得分:1)

您遇到了必须“清理”数据的古老问题。 这种情况经常发生在您有操作员或外面的地方从网上拉出东西时。问题是,你无法控制其他人投入你的系统。

正如您所提到的,“单引号”可能会导致问题。或者逗号可能会导致问题。此外,其他不可见的ascii字符可能会导致问题。 (特别是如果您要将文本发送到打印机。)像换行回车这样的东西可能会导致各种问题,甚至看不到它们在那里。

所以要回答你的问题“要注意哪些其他字符......”,我会将其改为“我想要允许哪些字符”。

这是指向all ascii characters地图的链接,您可以使用VBA扫描您读取的每个字符串。

这非常耗时,但如果您需要清理字符串数据,则需要这些内容。

基本思想是解析您正在读取的字符串(或将要读入),并逐字符地检查逻辑,以查看ascii代码是否在可接受的范围内。

即:

Dim strChar As String
Dim intAsc As Integer
Dim booFlag As Boolean

intAsc = Asc(strChar)
If ((intAsc >= 65) And (intAsc <= 90)) _
   Or ((intAsc >= 97) And (intAsc <= 122)) _
   Or ((intAsc >= 48) And (intAsc <= 57)) _
   Or ((intAsc = 32) _
Then
   booFlag = True
End If

范围65 - 90是你的大写字母。 97 - 122是小写。 48-57是零到九。 32是真正的太空人物的ascii。 并且您可以添加其他“或”语句以仅允许您在数据库中使用的代码。但是,你想要省略ascii的“单引号”和其他看不见的东西。

您可以将该代码放在VBA函数中,然后解析要检查的每个字符串。如果您发现不在批准列表中的内容,您可以将其更改为空格字符(或其他内容)。

此外,如果您担心SQL注入,而不是扫描关键字,则应考虑使用参数化查询来发送SQL命令。

希望能为您提供一个可供使用的框架。 :)