Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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
.net 使用OleDB/Jet导入数据表_.net_Vb.net_Jet - Fatal编程技术网

.net 使用OleDB/Jet导入数据表

.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

我用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 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的文件

  • 我需要替换字符
  • 值(i)=值(i).替换(“\t”,Constants.vbTab).替换(“\n”,Constants.vbLf).替换(“\r”,Constants.vbCr).替换(“\”,”).替换(“\”,“\”) 但它通常只适用于字符串

  • 我需要识别数据类型,如整数、双精度、字符串等。我的第一个想法是通过sql查询进行识别,并通过tryparse检查表

    Dim dtInserts As DataTable = db.GetDataTable("SELECT TOP 0 * FROM " & _table) Dim ListOfTypes As New List(Of System.Type) For Each _col As DataColumn In dtInserts.Columns Dim _type As System.Type = _col.DataType ListOfTypes.Add(_type) Next Dim _wert1 As String = "11.11.2011" Dim _type1 As System.Type = ListOfTypes.Item(1) If DateTime.TryParse(_wert1, New Date) Then End If Dim dtInserts As DataTable=db.GetDataTable(“从”和“表”中选择顶部0*) 将类型列表调整为新列表(System.Type的) 对于dtInserts.Columns中作为数据列的每个_列 Dim _类型为System.type=_col.DataType 类型列表。添加(\u类型) 下一个 Dim\u wert1为字符串=“11.11.2011” Dim _type1作为System.Type=类型列表项(1) 如果DateTime.TryParse(_wert1,新日期),则 如果结束 但仍然不确定它是否会起作用

  • 所有已读取的数据都应在1252代码页中进行编码。 这个真的不管用

  • Dim ConStr As String=“Provider=Microsoft.Jet.OLEDB.4.0;数据源=“&TextBox1.Text&“扩展属性=”“Text;HDR=Yes;FMT=Delimited;CODEPAGE=1252”“” 有人知道可以做什么吗?

    听上去你想做的大部分事情都可以做。可能也有用,我只是没用过那么多。我不推荐VB的
    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