使用oledb从csv / txt文件检索数据时“不是有效名称”错误

时间:2010-01-04 11:36:54

标签: vb.net csv oledb jet

我使用oledb驱动程序

从csv / txt文件中检索数据
ConnString = "Provider=Microsoft.Jet.OleDb.4.0; Data Source = " & System.IO.Path.GetDirectoryName(strFileName) & "; Extended Properties = ""Text;HDR=YES;FMT=Delimited"""

strQuery = "SELECT * FROM [" & System.IO.Path.GetFileName(strFileName) & "]"

在最后一行,如果文件名很大,我会收到以下错误

不是有效名称。确保它不包含无效字符或标点符号,并且不会太长。

我的问题 - 文件名或选择查询是否有限制,或者我需要遵循一些模式?

4 个答案:

答案 0 :(得分:2)

刚刚解决这个问题,我发现文件路径或名称的无部分可能包含空格或单引号,或者文件路径将被确定为无效。这适用于我尝试的名称的任何资格或逃避。

删除所有空格和单引号后,一切都很好。例如

<强>无效:

"C:\Users\Administrator\Documents\Data\User''s Folder\Import Data.csv"

<强>有效:

C:\Users\Administrator\Documents\Data\Users-Folder\ImportData.csv

答案 1 :(得分:1)

这是一个answer stolen shamelessly from Avi,这就是为什么它是社区wiki:

我建议查看内置于.Net的TextFieldParserClass而不是使用Oledb。你需要包括

Imports Microsoft.VisualBasic.FileIO.TextFieldParser

以下是一个快速示例:

        Dim afile As FileIO.TextFieldParser = New _
          FileIO.TextFieldParser(FileName)
        Dim CurrentRecord As String() ' this array will hold each line of data '
        afile.TextFieldType = FileIO.FieldType.Delimited
        afile.Delimiters = New String() {","}
        afile.HasFieldsEnclosedInQuotes = True

        ' parse the actual file '
        Do While Not afile.EndOfData
            Try
                CurrentRecord = afile.ReadFields
            Catch ex As FileIO.MalformedLineException
                Stop
            End Try
        Loop

我已经赞成answer I have borrowed

答案 2 :(得分:1)

一些实验表明,没有扩展名的文件名不得包含“。”。因此,MyData.csv是有效的文件名,但My.Data.csv不是。

答案 3 :(得分:0)

我没有确切地知道问题是什么,但很明显长文件名正在创建问题所以这里是what I did

ConnString = "Provider=Microsoft.Jet.OleDb.4.0; Data Source = " & System.IO.Path.GetDirectoryName(strFileName) & "; Extended Properties = ""Text;HDR=YES;FMT=Delimited"""

    '=================================== OleDB Supports fixed length file name. Handle long file names'
    Dim OldFileName As String = System.IO.Path.GetFileName(strFileName)
    Dim NewFileName As String = Guid.NewGuid().ToString().Substring(0, 10) + System.IO.Path.GetExtension(OldFileName)
    Dim rootPath As String = System.IO.Path.GetDirectoryName(strFileName) + "/"

    'Rename file name'
    My.Computer.FileSystem.RenameFile(rootPath + OldFileName, NewFileName)
    strFileName = rootPath + NewFileName
    '===================================='

    Dim strQuery As String
    strQuery = "SELECT * FROM [" & System.IO.Path.GetFileName(strFileName) & "]"

    'Revert rename file name'
    '===================================================================='
    My.Computer.FileSystem.RenameFile(rootPath + NewFileName, OldFileName)
    strFileName = rootPath + OldFileName
    '===================================================================='

我在将数据重命名为原始文件名后检索数据时,使用新的Guid重命名了该文件。

这不是我想要的,我仍然在寻找更好的解决方案。如果有人找到,请发帖。

由于