【问题标题】:Strange characters in string when importing sql file via VBA通过VBA导入sql文件时字符串中的奇怪字符
【发布时间】:2018-05-08 13:44:26
【问题描述】:

我正在尝试通过 VBA 将 SQL 文件导入 excel,以便将 SQL 代码作为一个字符串返回,但是当我将 SQL 作为字符串导入时,每个字符之间出现了小方块(回车?) - 不知道为什么!它以前在其他文件中使用过,使用不同的 SQL,所以我不确定我做错了什么。

Function ImportSQLText(FileExt, FileSQLName)
'//Needs Microsoft Scripting Runtime Ref
'//and microsoft active x data objects 2.8

Dim ReadText As String, newLine As String
Dim fso As FileSystemObject: Set fso = New FileSystemObject

Set txtStream = fso.OpenTextFile(FileExt & fileName, ForReading, False)

ReadText = " "
Do While Not txtStream.AtEndOfStream
    newLine = txtStream.ReadLine
    If InStr(newLine, "[input-sDte]") > 0 Then

        ReadText = ReadText & Replace(newLine, "[input-sDte]", sDte) & vbCrLf
    ElseIf InStr(newLine, "[input-eDte]") > 0 Then
        ReadText = ReadText & Replace(newLine, "[input-eDte]", eDte) & vbCrLf
    Else
         ReadText = ReadText & newLine & vbCrLf
    End If

Loop
txtStream.Close

ImportSQLText = ReadText

End Function

SQL 代码如下:

    ;if object_id('tempdb.#usr_fld') is not null

    drop table #usr_fld

    -- Creating Temp Table
    CREATE TABLE #usr_fld([PLACE-REF] NVARCHAR(50)
    ,[PROJCODE] nvarchar(100)
    ,[CUORACLE] nvarchar(100)); 

任何输入将不胜感激 - 这次谷歌搜索对我没有帮助。

【问题讨论】:

  • “在每个字符之间获得小方块” -> 可能将 UTF16 读取为 ANSI/ASCII/其他 8 位编码 - 尝试使用十六进制编辑器检查源文件。

标签: sql excel string vba


【解决方案1】:

你几乎肯定有一个 unicode 文件。 There is an optional fourth parameter on the OpenTextfileFSO 方法:

 Const TriStateTrue = -1
 Set txtStream = fso.OpenTextFile(FileExt & fileName, ForReading, False, TriStateTrue)

只需将您的线路换成这两个,它可能会解决问题。

【讨论】:

  • 不错。在将所有内容重写为 use an ADODB stream 之前,我会尝试这样做,尽管 documentation 似乎相当明确地暗示 FSO 不处理 unicode。
  • 同意。 Jet/Ace 也非常擅长对文本和 excel 文件做出错误的决定。在不知不觉中,您正在即时编写 schema.ini 并在运行时将系统 DSN 放入注册表中,以使事情正常进行。虽然,我确实爱我一些 ADODB。
  • hmm, this answer and its comments 强烈暗示 FSO 不会处理 UTF-8 编码 (UTF-8 != Unicode),使 ADODB.Stream 成为唯一剩下的选项,具体取决于 OP 的实际编码文件。 FWIW ADODB.Stream 与 Jet/Ace 或数据库无关,它只是一个文件流;-)
  • 我坚持认为 TriStateTrue 参数可以解决问题。 UTF-16LE 是 windows 默认的 unicode 是一个两字节的方案,OP 说每个字符之间会弹出一个额外的字符。 UTF-8 是三个字节(但通常只有两个)所以......它是 50/50。不知道关于 ADODB.stream。我将不得不阅读那个。
  • 太棒了!明白了 - 非常感谢!让我完全糊涂了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
相关资源
最近更新 更多