【发布时间】:2016-10-09 20:27:23
【问题描述】:
我编写了一个函数,它读取 csv 文件并相应地对其进行参数化,因此我有一个函数 gettypessql,它首先查询 sql 表以获取数据类型,从而调整稍后插入 sql 中的列。所以我的问题是当我在 Jet OLE DB 中设置 HDR=Yes 时,我只得到 F1、F2、F3 之类的列名。为了规避这个问题,我设置了 HDR=No 并编写了一些 for 循环,但现在我只得到空字符串,究竟是什么问题?这是我的代码:
Private Function GetCSVFile(ByVal file As String, ByVal min As Integer, ByVal max As Integer) As DataTable
Dim ConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & TextBox1.Text & ";Extended Properties=""TEXT;HDR=NO;IMEX=1;FMT=Delimited;CharacterSet=65001"""
Dim conn As New OleDb.OleDbConnection(ConStr)
Dim dt As New DataTable
Dim da As OleDb.OleDbDataAdapter = Nothing
getData = Nothing
Try
Dim CMD As String = "Select * from " & _table & ".csv"
da = New OleDb.OleDbDataAdapter(CMD, conn)
da.Fill(min, max, dt)
getData = New DataTable(_table)
Dim firstRow As DataRow = dt.Rows(0)
For i As Integer = 0 To dt.Columns.Count - 1
Dim columnName As String = firstRow(i).ToString()
Dim newColumn As New DataColumn(columnName, mListOfTypes(i))
getData.Columns.Add(newColumn)
Next
For i As Integer = 1 To dt.Rows.Count - 1
Dim row As DataRow = dt.Rows(i)
Dim newRow As DataRow = getData.NewRow()
For j As Integer = 0 To getData.Columns.Count - 1
If row(j).GetType Is GetType(String) Then
Dim colValue As String = row(j).ToString()
colValue = ChangeEncoding(colValue)
colValue = ParseString(colValue)
colValue = ReplaceChars(colValue)
newRow(j) = colValue
Else
newRow(j) = row(j)
End If
Next
getData.Rows.Add(newRow)
Application.DoEvents()
Next
Catch ex As OleDbException
MessageBox.Show(ex.Message)
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
dt.Dispose()
da.Dispose()
End Try
Return getData
End Function
获取类型 sql,这个不能正确转换,尤其是 doubles
Private Sub GetTypesSQL()
If (mListOfTypes Is Nothing) Then
mListOfTypes = New List(Of Type)()
End If
mListOfTypes.Clear()
Dim dtTabelShema As DataTable = db.GetDataTable("SELECT TOP 0 * FROM " & _table)
Using dtTabelShema
For Each col As DataColumn In dtTabelShema.Columns
mListOfTypes.Add(col.DataType)
Next
End Using
End Sub
【问题讨论】:
-
连接字符串的
HDR=Yes部分是第一行是否有列名(而不是您是否要使用这些名称)。如果在没有标题时使用 YES,则会跳过一行。有几种方法可以覆盖和指定要使用的列名,还有一种更简单的方法可以在不解析和转换的情况下指定类型。我只是不确定问题是什么。 -
..另外,该代码是要作用于特定的文件-表对还是您正在尝试编写通用的 csv-to-table 处理器?
-
好吧,实际上它应该处理所有 csv 文件,但我发现文件包含一些错误。但无论如何,当我运行程序时,它并没有真正将所有列正确转换为特定类型,例如它将双精度转换为数据,原因不明
-
如果是通用导入器,从3个方法中怎么知道哪些列需要处理?在不需要解析/编码/等的列上调用它们会产生不良影响吗?
-
function gettypessql 只是查询已经使用所有数据类型创建的 sql 表,它只是获取它们并保存在 mListtypes 中,然后将其分配给使用 oledb 读取的所有列,然后处理所有行这是字符串。 csv导入器自动知道需要处理什么
标签: vb.net oledb sqldatatypes jet