Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 使用OLEDB读取CSV文件会忽略第一行,即使连接字符串中的HDR=No_Asp.net_Vb.net_Csv_Oledb - Fatal编程技术网

Asp.net 使用OLEDB读取CSV文件会忽略第一行,即使连接字符串中的HDR=No

Asp.net 使用OLEDB读取CSV文件会忽略第一行,即使连接字符串中的HDR=No,asp.net,vb.net,csv,oledb,Asp.net,Vb.net,Csv,Oledb,我们正在将一个经典的ASP站点转换为ASP.NET站点。一个功能是上传CSV格式的数据“模板”,以便导入数据库。其中有几种不同的记录类型(第一个字段始终标识数据类型) 任务是将CSV放入数据表中,以便对其进行验证(新项目将具有更好的验证规则) 代码似乎非常简单-淡化(去掉注释、Try/Catch等),如下所示: Dim da As New System.Data.OleDb.OleDbDataAdapter Dim cn As New System.Data.OleDb.OleD

我们正在将一个经典的ASP站点转换为ASP.NET站点。一个功能是上传CSV格式的数据“模板”,以便导入数据库。其中有几种不同的记录类型(第一个字段始终标识数据类型)

任务是将CSV放入数据表中,以便对其进行验证(新项目将具有更好的验证规则)

代码似乎非常简单-淡化(去掉注释、Try/Catch等),如下所示:

    Dim da As New System.Data.OleDb.OleDbDataAdapter
    Dim cn As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strDirectory & ";" & "Extended Properties=""Text;HDR=No;FMT=Delimited;""")
    Dim cd As New System.Data.OleDb.OleDbCommand("SELECT * FROM " & strCSVFilename, cn)
    cn.Open()
    da.SelectCommand = cd
    da.Fill(dtData)
数据表(dtData)已填充,但仅从CSV文件的第二行开始,尽管连接字符串中有“HDR=No”


我在这里遗漏了什么?

文件开头是否有导致跳过第一行的内容?也许是不可打印的字符?NPC可能来自未按预期编码保存的文件。当我创建CSV文件时,我收到了您期望的结果。下面是我用来测试的代码:

    Private Sub Test()
    Dim TempDir = My.Computer.FileSystem.SpecialDirectories.Temp
    Dim TempFile = "Test.csv"

    '//Create our test file with a header row and three data rows
    Using FS As New System.IO.FileStream(System.IO.Path.Combine(TempDir, TempFile), IO.FileMode.Create, IO.FileAccess.Write, IO.FileShare.Read)
        Using SW As New System.IO.StreamWriter(FS, System.Text.Encoding.ASCII)
            SW.WriteLine("Col1,Col2")
            SW.WriteLine("R1", "R1")
            SW.WriteLine("R2", "R2")
            SW.WriteLine("R3", "R3")
        End Using
    End Using

    '//Read the data into a table specifying that the first row should be treated as a header
    Using dtData As New DataTable()
        Using da As New System.Data.OleDb.OleDbDataAdapter
            Using cn As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & TempDir & ";" & "Extended Properties=""Text;HDR=Yes;FMT=Delimited;""")
                Using cd As New System.Data.OleDb.OleDbCommand("SELECT * FROM " & TempFile, cn)
                    cn.Open()
                    da.SelectCommand = cd
                    da.Fill(dtData)
                    Trace.WriteLine("With header,    expected 3, found " & dtData.Rows.Count)
                End Using
            End Using
        End Using
    End Using

    '//Read the data into a table again, this time specifying that the there isn't a header row
    Using dtData As New DataTable()
        Using da As New System.Data.OleDb.OleDbDataAdapter
            Using cn As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & TempDir & ";" & "Extended Properties=""Text;HDR=No;FMT=Delimited;""")
                Using cd As New System.Data.OleDb.OleDbCommand("SELECT * FROM " & TempFile, cn)
                    cn.Open()
                    da.SelectCommand = cd
                    da.Fill(dtData)
                    Trace.WriteLine("Without header, expected 4, found " & dtData.Rows.Count)
                End Using
            End Using
        End Using
    End Using

    '//Delete our temporary file
    System.IO.File.Delete(System.IO.Path.Combine(TempDir, TempFile))
End Sub

如果您将初始编码更改为Unicode,那么结果中将显示8行和9行,这可能就是您看到的结果。如果结果是编码问题,您可以将
CharacterSet=Unicode
添加到扩展属性中。

关闭但不关闭。原来问题出在我传递给SELECT*FROM命令的文件名中。最初,路径位于Connect字符串和SELECT命令中。当我从SELECT命令中取出路径时,由于某种原因,它起了作用。换句话说,“SELECT*FROM Sample.csv”提供了所有行。“从C:\Inetpub\wwwroot\Site\Upload\Sample.csv中选择*将导致忽略第一行。我将在这个答案上打勾,因为它让我沿着正确的路径开始。如下所示,如果strCSVFilename中有一个路径,无论出于什么原因,它都会将第一行视为标题行。如果它只有文件名(并且连接字符串将告诉ADO要使用的路径),则第一行被导入到数据表中。数据源有路径,SELECT语句只有文件名。HDR=否,但第1行的字段将成为列标题。