.net 使用OleDB/Jet导入数据表
我用Oledb编写了一个短函数,它应该读取大量数据,但仍有几个问题我无法解决,这是关于在sql数据库中读取和插入分号分隔的数据.net 使用OleDB/Jet导入数据表,.net,vb.net,jet,.net,Vb.net,Jet,我用Oledb编写了一个短函数,它应该读取大量数据,但仍有几个问题我无法解决,这是关于在sql数据库中读取和插入分号分隔的数据 Private Function GetCSVFile(ByVal file As String) As DataTable Try Dim dt As New DataTable Dim ConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Private Function GetCSVFile(ByVal file As String) As DataTable
Try
Dim dt As New DataTable
Dim ConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & TextBox1.Text & ";Extended Properties=""TEXT;HDR=Yes;FMT=Delimited"""
Dim conn As New OleDb.OleDbConnection(ConStr)
Dim da As New OleDb.OleDbDataAdapter("Select * from " & _table & ".csv", conn)
da.Fill(dt)
Application.DoEvents()
getData = dt
Catch ex As OleDbException
MessageBox.Show(ex.Message)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Return getData
End Function
一,。它读取整个文件,但我需要告诉函数,它应该只读取50.000行,并将它们一步一步地传递给另一个函数,它应该更好地在for循环中工作,因为jet-oledb不读取大于1GB的文件
TextFieldParser
,因为它返回的是字符串数组而不是类型化数据
OleDB
提供了一种很好的导入方式,但将其保存到数据库会带来一个小挑战。所有加载的行的RowState
为Unchanged
。将其更改为添加的唯一方法是将行复制到新表中:
For Each dr As DataRow In dtCSV.Rows
dtDest.Rows.Add(dr.ItemArray)
Next
它将起作用,但结果是,您将有2个表,同时加载所有这些行。事实证明,使用CSVHelper和简单的INSERT查询是最经济的—因为记录是从IEnumerable
中获取的,一次只加载一条源记录。它也比复制行快一点:在500k行上大约快20%
注意:除了分号分隔的数据外,我们完全不知道数据是什么样子的……而且显然有很多数据
Using sr As New StreamReader(CSVFilePath, False),
csv As New CsvReader(sr)
' some CSVHelper config options
csv.Configuration.HasHeaderRecord = True
csv.Configuration.TrimFields = True
csv.Configuration.TrimHeaders = True
csv.Configuration.Delimiter = ";"
csv.Configuration.IsHeaderCaseSensitive = False
csv.Configuration.RegisterClassMap(Of RandItem.RandItemMap)()
' get the file into IEnumerable collection
Dim csvData = csv.GetRecords(Of OleImportItem)()
Dim SQL = <sql>
INSERT INTO RandomData
(Foo, Bar, Cat, Dog...)
VALUES
(@p1, @p2, @p3, @p4...)
</sql>.Value
Using dbcon As New OleDbConnection(ACEConnStr)
Using cmd As New OleDbCommand(SQL, dbcon)
dbcon.Open()
' create the parameters
cmd.Parameters.Add("@p1", OleDbType.VarChar)
cmd.Parameters.Add("@p2", OleDbType.VarChar)
cmd.Parameters.Add("@p3", OleDbType.Integer)
cmd.Parameters.Add("@p4", OleDbType.Integer)
...
' load one item at a time, to save it
For Each item In csvData
cmd.Parameters("@p1").Value = item.Foo
cmd.Parameters("@p2").Value = item.Bar
cmd.Parameters("@p3").Value = item.Cat
cmd.Parameters("@p4").Value = item.Dog
...
cmd.ExecuteNonQuery()
Next
End Using
End Using
End Using
使用sr作为新的StreamReader(CSVFilePath,False),
csv作为新的CsvReader(sr)
'一些CSVHelper配置选项
csv.Configuration.HasHeaderRecord=True
csv.Configuration.TrimFields=True
csv.Configuration.TrimHeaders=True
csv.Configuration.Delimiter=“;”
csv.Configuration.ishaderCaseSensitive=False
csv.Configuration.RegisterClassMap(属于RandItem.RandItemMap)()
'将文件放入IEnumerable集合
Dim csvData=csv.GetRecords(属于OleImportItem)()
Dim SQL=
插入随机数据
(福、巴、猫、狗……)
价值观
(@p1、@p2、@p3、@p4…)
价值
使用dbcon作为新的OLEDB连接(ACEConnStr)
使用cmd作为新的OleDbCommand(SQL、dbcon)
dbcon.Open()
'创建参数
cmd.Parameters.Add(“@p1”,OleDbType.VarChar)
cmd.Parameters.Add(“@p2”,OleDbType.VarChar)
cmd.Parameters.Add(“@p3”,OleDbType.Integer)
cmd.Parameters.Add(“@p4”,OleDbType.Integer)
...
'一次加载一个项目以保存它
对于csvData中的每个项目
cmd.Parameters(“@p1”).Value=item.Foo
cmd.Parameters(“@p2”).Value=item.Bar
cmd.Parameters(“@p3”).Value=item.Cat
cmd.Parameters(“@p4”).Value=item.Dog
...
cmd.ExecuteNonQuery()
下一个
终端使用
终端使用
终端使用
我不能给出一个完整的教程来说明如何使用它,但一般来说,您创建一个类型(类)来定义每个列的数据类型(这里,RandItem
),RandItemMap
是另一个类,它指定了这些属性在文件中的顺序。这样,CSVHelper知道每列的数据类型,并将为您进行转换
有几种方法可以使用它,这种方法是从文件中一次读取一行,然后立即将该项保存到数据库:csvData=csv.GetRecords(属于OleImportItem)(
将csvData
初始化为IEnumberable(属于RandItem)
,因此,在循环中一次只加载一个项目,这使得它非常经济
在循环中,代码从csv文件中获取键入的项
,然后将其映射到相应的参数并保存。这比将数据批量复制到数据表并保存快约20%;而且内存占用更少,因为只加载了一个项目
对于较小的csv文件,可以使用
.ToArray()
或ToList()
将文件加载到集合中
注意导入/解析没有标题的文本文件与所示略有不同,但同样简单
听起来,CSVHelper可能会解决您洗衣单中的大多数问题。1个问题,请一次解决一个问题,将4个问题捆绑在一起会使问题过于宽泛,也很难给出一个简短的答案。看这里,3和4是非常可行的,#2在没有样本数据的情况下太模糊,无法理解您想要做什么,#1可能可以根据数据以本机方式完成,否则您可能需要添加一个步骤。如果你把问题细化到不那么宽泛的地方
For Each dr As DataRow In dtCSV.Rows
dtDest.Rows.Add(dr.ItemArray)
Next
Using sr As New StreamReader(CSVFilePath, False),
csv As New CsvReader(sr)
' some CSVHelper config options
csv.Configuration.HasHeaderRecord = True
csv.Configuration.TrimFields = True
csv.Configuration.TrimHeaders = True
csv.Configuration.Delimiter = ";"
csv.Configuration.IsHeaderCaseSensitive = False
csv.Configuration.RegisterClassMap(Of RandItem.RandItemMap)()
' get the file into IEnumerable collection
Dim csvData = csv.GetRecords(Of OleImportItem)()
Dim SQL = <sql>
INSERT INTO RandomData
(Foo, Bar, Cat, Dog...)
VALUES
(@p1, @p2, @p3, @p4...)
</sql>.Value
Using dbcon As New OleDbConnection(ACEConnStr)
Using cmd As New OleDbCommand(SQL, dbcon)
dbcon.Open()
' create the parameters
cmd.Parameters.Add("@p1", OleDbType.VarChar)
cmd.Parameters.Add("@p2", OleDbType.VarChar)
cmd.Parameters.Add("@p3", OleDbType.Integer)
cmd.Parameters.Add("@p4", OleDbType.Integer)
...
' load one item at a time, to save it
For Each item In csvData
cmd.Parameters("@p1").Value = item.Foo
cmd.Parameters("@p2").Value = item.Bar
cmd.Parameters("@p3").Value = item.Cat
cmd.Parameters("@p4").Value = item.Dog
...
cmd.ExecuteNonQuery()
Next
End Using
End Using
End Using