序列或批处理项目 DataGridView

2024-04-02

我有一个包含 940000 行的大型 DataGridView...哎呀,通过解析 csv 文件填充,DataGridView 有一个名为序列的列,编号为 1 到 940000。我试图做的是重新编号序列以溢出到序列中DataGridView 中的行数为 1 到 7000。对序列列重新排序的最有效方法是什么?

Using reader As New Microsoft.VisualBasic.FileIO.TextFieldParser(fileName)
        reader.TextFieldType = FileIO.FieldType.Delimited
        reader.SetDelimiters(",")
        Dim currentRow As String()
        Dim serial As String
        Dim sequence As Integer = 0
        Dim RollId As String

        'pbUploadFile.Maximum = serialAmmount / quantityBreak
        pbUploadFile.Maximum = serialAmmount
        pbUploadFile.Step = 1
        pbUploadFile.Value = 0

        For i = 1 To serialAmmount / quantityBreak
            For j = 1 To quantityBreak
                Try
                    currentRow = reader.ReadFields()
                    serial = currentRow(0).ToString
                    sequence += 1
                    EnterDataIntoDatabase(serial, sequence, nextRollNumber, ddSelectPartNumber.Text)
                    pbUploadFile.Increment(1)
                Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
                    MsgBox("Code " & ex.Message & "is not valid and will be skipped check csv file")
                End Try
            Next j

            sqlCmd = New SqlClient.SqlCommand("SELECT * FROM serials WHERE Sequence=@sequence AND RollNo=@rollNo ", sqlCon)
            sqlCmd.CommandType = CommandType.Text
            sqlCmd.Parameters.AddWithValue("@sequence", 1)
            sqlCmd.Parameters.AddWithValue("@rollNo", nextRollNumber)
            sqlCon.Open()
            Dim readRollId As SqlClient.SqlDataReader = sqlCmd.ExecuteReader()
            If readRollId.Read() Then
                RollId = readRollId.Item("Code")
            End If
            sqlCon.Close()


            UpdateAvailableRolls(ddSelectPartNumber.Text, nextRollNumber, RollId)
            nextRollNumber += 1
            UpdateRollNo(nextRollNumber)
            sequence = 0
            'pbUploadFile.Increment(1)
        Next i
        SaveFile()
    End Using

通常最好考虑如何使用数据以及在决定如何做某事以及使用什么工具来完成某件事时如何使用。没有人对|快|做大多数事情的有效方法。

也就是说,有一些不好的做事方式。用一个DataGridView作为数据容器似乎不明智(尽管我实际上在代码中看不到与 DGV 相关的任何内容)。 A)没有自动方式让数据进入其中 - 你必须编写代码来做到这一点,2)没有自动方式让数据进入其他地方 - 你必须编写代码来循环它并且将数据捞出来。然后是所有数据都可能存储为字符串的问题。

看起来还有更多的事情发生,而不仅仅是批量处理物品。下面将从 CSV 导入行,处理它们并将它们写回数据库(我使用的是 MySql,但概念是相同的)。


首先,TextFieldParser是一个非常方便的工具,但它有一个主要缺点,即它只返回字符串。如果 CSV 中包含价格、日期、布尔值等,则该类型会丢失。在许多情况下,CSVHelper 会是更好的选择。

在本例中,由于数据的目的地是数据库,因此我将使用 OleDB 将 CSV 读入DataTable,批处理,然后发送到数据库。

使用 OleDB 导入数据

架构.INI

OleDb 包含一个可用于解析 CSV 的文本文件驱动程序。它可以根据前几行的上下文“猜测”数据类型,但您也可以定义它们。在 CSV 所在的文件夹/目录中,创建一个名为的新文本文件Schema.INI。像这样定义 CSV 和列:

[大写字母.Csv]
ColNameHeader=True
格式=CSVDelimited
文本分隔符=
小数符号=.
货币符号=$
Col1=“国家/地区”文本宽度 254
Col2=“首都”文本宽度 254
Col3=“人口”单
Col4=“排名”整数
Col5=“国庆节”日期

  • 您可以在一个文件中包含多个 csv 定义,每个定义都以[...]
  • The [...]是 CSV 的名称
  • 如果 CSV 有标题行,则可以使用这些标题行作为列名称
  • 如果列也用引号括起来(“Like this”、“in”、“the csv”),请使用TextDelimiter="
  • Each Col#=条目定义数据类型并可以覆盖名称。这允许您将 CSV 中名为“Foo”的列“映射”到数据库中名为“Bar”的列。
  • 可以指定其他选项,例如小数点和货币符号以及文件中使用的代码页。

连接字符串

要使用的连接字符串是:

ACEImportStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='{0}';Extended Properties='TEXT'"

The Data Source将是 CSV 和 Schema.INI 都存在的文件夹,并且“TEXT”元素告诉它使用文本驱动程序。使用文件夹名称填写空白:

ACEImportConnStr = String.Format(ACEImportConnStr, "C:\Temp")

OLEDB.12 有时可能很挑剔,如果有问题,请使用Microsoft.Jet.OLEDB.4.0改为提供者。

现在,要加载数据,只需从 CSV 文件名中选择(无文件夹):

Dim sSQL = "SELECT * FROM RandomOle.CSV"
...
Dim daSrc = New OleDbDataAdapter(sSQL, OleCSVConnstr)
rowsLoaded = daSrc.Fill(dtSample)

The DataAdapter将读取定义的架构,并在几秒钟内将 CSV 加载到数据表中。处理其他任务还有更多工作要做,但这就是概念。

Dim sSQL = "SELECT * FROM YOUR_CSVFILE_NAME.CSV"
Dim sw As New Stopwatch

Dim rowsLoaded As Int32
Dim rowsUpdated As Int32

sw.Start()
ACEImportConnStr = String.Format(ACEImportConnStr, "C:\Temp")

' create Destination MySQL conn, Src and Dest dataadapters,
' and a command builder (because I am lazy...and fallible)
Using mysqlCon As New MySqlConnection(MySQLConnStr),
    daSrc As New OleDbDataAdapter(sSQL, ACEImportConnStr),
    daDest As New MySqlDataAdapter("SELECT * FROM Sample", mysqlCon),
    cb As New MySqlCommandBuilder(daDest)

    ' important!
    daSrc.AcceptChangesDuringFill = False

    dtSample = New DataTable
    rowsLoaded = daSrc.Fill(dtSample)

    ' csv lacks an ID column - add it
    Dim dc As New DataColumn("Id", GetType(Int32))
    dc.DefaultValue = 1
    dtSample.Columns.Add(dc)
    dc.SetOrdinal(0)

    ' MY csv also lacks a BATCH column
    dc = New DataColumn("Batch", GetType(Int32))
    dc.DefaultValue = 1
    dtSample.Columns.Add(dc)
    dc.SetOrdinal(1)

    ' set the batch number
    ' each 5k rows == a batch
    Dim batch As Int32 = 1
    Dim counter As Int32 = 1
    For Each dr As DataRow In dtSample.Rows
        dr("Batch") = batch
        counter += 1
        If counter > 5000 Then
            counter = 0
            batch += 1
        End If
    Next

    ' now save the data to MySQL
    mysqlCon.Open()
    ' inserting 250k rows takes a while,
    ' use a transaction
    Using t As MySqlTransaction = mysqlCon.BeginTransaction
        rowsUpdated = daDest.Update(dtSample)
        t.Commit()
    End Using

End Using

' show the IMPORT in a dgv
dgv1.DataSource = dtSample
dgv1.Columns("Id").Visible = False

' report
sw.Stop()
Console.WriteLine(sw.ElapsedMilliseconds)

原理很简单:由于数据绑定到数据库,因此将数据放入DataTable尽快。这里的技巧是,涉及 2 个 DB Provider:OleDB 用于读取 csv,MySql 用于保存。

  • 通常当 DataAdapter 填充DataTable所有行都设置为Unchanged. AcceptChangesDuringFill = False将状态设置为Added以便 MySql 适配器可以插入这些行。
  • CommandBuilder 构建要从 SELECT 命令使用的 INSERT SQL。
  • 我不知道该 serials-rollno 查询在做什么,但我会not在导入过程循环内运行查询。如果您需要设置的某些值取决于数据库中的值,请将它们加载到另一个 DT 中并从那里查询它们。有一些 DataTable 扩展方法可以轻松查找行。
  • 同样,我也不知道什么EnterDataIntoDatabase确实如此,但您应该努力处理和准备中的所有导入数据DataTable,然后一次性全部更新。

您似乎要做的不仅仅是对一堆行进行批处理或排序。上面的代码可以在 1.2 分钟内导入 250k 行、分配批号以及将 250k 新行插入 MySql(几乎每秒 3500 行)。


如果批处理/排序器类似于 CSV 中按顺序排列的每 X 行,您可能一次只能加载 7000 行,设置值,保存该批处理,然后加载接下来的 7000 行。这将限制任一时间加载的行数并减少应用程序使用的内存。我不确定它是否适用。

参考:

  • 架构.ini 文件 https://msdn.microsoft.com/en-us/library/ms709353(v=vs.85).aspx on MSDN
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

序列或批处理项目 DataGridView 的相关文章

  • 如何使用网络浏览器控件填写 html 表单

    在VB6 classic中 我们可以这样做 Private Sub Form Load WebBrowser1 Navigate2 http yourSite com End Sub Private Sub Command1 Click W
  • 如何在 vb.Net 中设置默认表单?

    如何将第四个表单设置为在 Visual Studio 2008 中按 f5 时将运行的默认表单 因为表单 1 始终是第一个启动的 在解决方案资源管理器中右键单击您的项目 选择属性 选择应用程序选项卡 从 启动表单 下的下拉列表中选择您的表单
  • 如何在没有 ServiceHost 类的情况下使用 WCF 创建简单的 Web 服务器?

    我已经开始学习 WCF 并希望通过直接使用通道堆栈创建一个简单的 Web 服务器来了解其内部结构 我在网络上找到了很多理论 但我希望看到一个接收和响应 httprequest 的工作示例代码 我可以使用任何浏览器进行测试 我希望能够通过组装
  • 在 foreach 循环中启动一个新线程

    我有一个对象列表 我想循环该列表并启动一个新线程 传入当前对象 我写了一个我认为应该这样做的例子 但它不起作用 具体来说 线程似乎在每次迭代中都被覆盖 但这对我来说并没有什么意义 因为我每次都会创建一个新的 Thread 对象 这是我写的测
  • 如何在公共交通中记录失败的消息?

    我正在寻找一个好的解决方案来在超出重试限制后立即记录失败消息 而无需处理错误队列 到目前为止我发现了什么 我可以继承InMemory入站消息跟踪器并覆盖是否超出重试限制 但此时除了 id 之外 没有关于消息本身的信息 我可以实施IInbou
  • CLR 分析器:使用 DefineAssemblyRef 时出现问题

    我想编写一个 CLR 分析器来挂钩我们的应用程序函数GetILFunctionBody SetILFunctionBody 我想使用 DefineAssemblyRef 导入我们的 c dll 用于 IL 代码 在此代码中 DefineAs
  • Azure 应用服务 - 自定义身份验证 - 不允许 HTTP 动词

    我按照本教程在我的 Xamarin Forms 应用程序中启用身份验证 https adrianhall github io develop mobile apps with csharp and azure chapter2 custom
  • 具有多种日期时间表示形式的 CultureInfo

    假设我们有一个 WCF 服务 需要一些时间DateTime对象并使用它 我们有一个以格式发送它的客户端dd mm yyyy 但是这个服务也是从 JS 调用的 它应该发送准确的DateTime 这就是为什么它使用yyyy MM ddTHH m
  • 将属性名称作为字符串传递到方法中 .NET

    我正在将 LINQ to SQL 用于 NET MVC 应用程序 在我的数据库中 我有一堆包含 Y 或 N 值的列 我正在尝试编写一个通用方法 该方法将返回数据库中的所有记录columnName Y 到目前为止我已经得到了这个 public
  • 有什么理由不将 pdb 与您的应用程序一起提供吗?

    既然您可以使用 Reflector 对 Net 应用程序进行逆向工程 那么有什么理由不随应用程序一起发送 pdb 文件呢 如果您确实将它们一起发送 那么您的堆栈跟踪将包括出现问题的行号 这在崩溃时很有用 每条评论请仅输入 1 个投票理由 传
  • 重写方法时,我的自定义代码应该位于 super(base) 之前还是之后

    重写方法时 我的自定义代码应该在对父类的超级 基 调用之前还是之后 这里有 3 个选择 如果你想执行代码之前的基本行为 然后之前调用它 如果你想执行代码后的基本行为 然后调用它 如果你想完全覆盖基本行为 根本不调用它 重要的是还检查您的 A
  • ILMerge 最佳实践

    你用ILMerge吗 您是否使用 ILMerge 合并多个程序集以简化 dll 的部署 在将程序集合并在一起后 您是否发现生产中的部署 版本控制存在问题 我正在寻找一些有关使用 ILMerge 减少部署摩擦的建议 如果可能的话 我将 ILM
  • 关于 ColorMatrix 转换如何工作的说明

    我正在图像处理应用程序上做一些工作 为了好玩 并且正在努力完全理解 ColorMatrix 转换的工作原理 我了解了线性 仿射变换的基础知识 并且可以通过在线复制示例来很好地理解 但我想完全掌握why有些东西有效 而不是仅仅满足于它有效 例
  • MEF 或 MEF2 是否已融入 .NET Framework 中?

    我正在尝试了解 MEF 并且看到对 MEF 和 MEF 2 的引用 This site http www palmmedia de blog 2011 8 30 ioc container benchmark performance com
  • 选择 Enum 类型的默认值而无需更改值

    在 C 中 是否可以用属性修饰 Enum 类型或执行其他操作来指定默认值 而不更改值 无论出于何种原因 所需的数字可能是一成不变的 并且仍然可以控制默认值会很方便 enum Orientation None 1 North 0 East 1
  • 异步回调到BackgroundWorker

    我想使用 NET FTP 库 http netftp codeplex com http netftp codeplex com 该库提供 BeginOpenRead string AsyncCallback object 使用异步编程模型
  • Microsoft.Web.Administration 内存泄漏

    拥有一个 Windows 服务 除其他外 还可以监视 IIS 应用程序池 如果任何池已配置应用程序但未运行 则该池 池 将启动 这已经运行良好一段时间了 最近发现该服务存在内存泄漏 查看内存转储 罪魁祸首是用于检查应用程序池的 Micros
  • 如何从 nuget 包中排除子目录和内容

    所以我有一个网站正在尝试打包用于 Octopus Deploy 我有以下文件夹结构 Web Views WantThis Dontwantthis WantThis1 WantThis2 lots more Scripts 我试图排除 Do
  • 使用 WaitHandle.WaitAll 时是否可以对 ThreadPool 中的任务进行分组/隔离?

    我面临的情况如下 因为 ThreadPool 每个进程有 1 个实例 所以我的问题是方法 1 会在 3 秒后取消按方法 2 排队的任务 http请求进来 method 1 gets executed first ThreadPool Que
  • 是一对一的关系不好的策略

    用户始终拥有一个钱包 一个钱包始终属于一位用户 由于我想分离与钱夹相关的属性 我创建了 Wallet 对象并能够跟踪钱交易 我创建了 public Wallet Entity

随机推荐

  • Mule 方法无法转换为字符串

    我对骡子工作室很陌生 这是环境设置 VM1 Windows 7 Visual Studio 2012 IIS 7 IIS 7 中托管的 net 4 5 WCF Web 服务 具有接受字符串并返回字符串的操作 VM2 Ubuntu 13 4
  • Titanium 用于 Windows 平台上的 iOS 开发

    我已经下载了 Windows 平台的 Titanium 正确安装后 我发现它需要iOS SDK 那么我应该从哪里获取iOS SDK 在Windows平台上可以开发iOS吗 使我的 Hello World 示例在适用于 iOS 的 Windo
  • 错误:R 中的下标类型“列表”无效

    这里有一个问题 我正在使用 eclipse 参数创建一个函数来处理不同的函数参数 我重新创建了类似的情况来显示我不断遇到的问题 gt d lt data frame alpha 1 3 beta 4 6 gamma 7 9 gt d alp
  • where 和having 关于别名的区别

    如果我在中创建一个别名select那么我不能在where子句因为根据sql查询的执行顺序where出现在之前select 但我可以在中创建一个别名select子句并将其用于having虽然条款having出现在之前select 为什么会这样
  • Knockoutjs 当父级可观察到的更改时更新子级

    当使用 KnockoutJs 父可观察更改时 如何触发子元素的更新 在我的应用程序中 我正在构建一个翻译工具 我有一个淘汰赛类 表示某些文本的原始 默认 值 以及翻译后的子项的集合 function ParentObject id defa
  • CSS 动画 - 动画缓慢且抖动

    我想问一下 这段CSS代码有什么问题吗 它用于动画背景图像 缩放效果 media min width 1000px anim on background size 110 110 background position center cen
  • 在 Golang 中访问上传的文件

    我在访问使用 golang 上传的文件时遇到问题 我对这门语言真的很陌生 并且已经进行了多次尝试 在网上也找不到任何答案 我究竟做错了什么 在此代码中 我从未到达列出已上传文件数的块 func handler w http Response
  • 野田时间:Period.Between() 返回错误的天数?

    鉴于下面的代码片段 为什么最后四个输出周期相同 我希望这些行的天数部分为 4 3 2 1 而不是 4 4 4 4 这是一个错误还是我遗漏了一些明显的东西 已经很晚了 我也累了 所以很可能是后者 我使用的是Noda Time 1 2 0 fo
  • 阻止 robots.mouseMove 生成​​ MouseEvent?

    我有一个 3D 游戏 每次移动光标时 我希望它重置到中间 问题是 robots mouseMove 调用 MouseEvent 它确实有意义 并重置位置 所以我无法旋转 谢谢你 我更喜欢如下代码 component removeMouseL
  • 如何重写对象ArrayList的ToString方法?

    class Person public String firstname public String lastname Person p1 new Person Jim Green Person p2 new Person Tony Whi
  • 了解 STG

    GHC 的设计基于 STG 它代表 无脊椎 无标签的 G 机器 现在G machine显然是 图缩减机 的缩写 它定义了惰性是如何实现的 未评估的 thunk 存储为表达式树 执行程序涉及reducing这些都归结为正常形式 Atree是一
  • 将字符串编码为十六进制

    我有将字符串转换为十六进制的函数 function encode str str encodeURIComponent str split join return str toLowerCase example 守护村子 alert enc
  • 在vim中搜索并替换选定的文件路径

    我经常处理内部充满文件路径的文件 我希望能够在可视模式下快速选择我的文件路径并将其替换为其他文件路径 例如我有这样的文件 balvadsd mnt Windows Documents and Settings stuff file exe
  • VBA - CallByName 不接受变体参数

    解决方案 只需在 CallByName 语句中的 Value 两边加上括号即可强制对其求值 Ex CallByName MobClass TargetData vbLet Value 感谢来自另一篇文章的 Rory 我可能会删除该文章 因为
  • 使用蒙特卡罗模拟计算 π 的局限性

    我问过一个与此非常相似的问题 所以我会在最后提到以前的解决方案 我有一个website https monte carlo sjorsvanholst nl使用客户端的 CPU 计算 同时将其存储在服务器上 到目前为止我已经得到 701 7
  • 在客户端 SAPUI5 中仅过滤 sap.m.List

    我正在寻找仅在客户端过滤列表 并让其他类似表等在服务器端过滤 是否有任何选项可以添加到列表中以在客户端进行过滤 问候 您可以使用操作模式v2 ODataModel 的参数 该参数可以设置为模型级别 https openui5 hana on
  • 如何应用 django 补丁

    我想对这个错误应用补丁 http code djangoproject com ticket 13095 http code djangoproject com ticket 13095 但我以前从未这样做过 我不知道从哪里开始 谁能给我指
  • 如何使用 Spring JPA 仅获取实体的选定属性?

    我在我的项目中使用 Spring Boot 1 3 3 RELEASE 和 Hibernate JPA 我的实体看起来像这样 Data NoArgsConstructor Entity Table name rule public clas
  • 读取 jar 文件中的 zip 文件

    之前我们的 Web 应用程序中有一些 zip 文件 我们想要解析 zip 文件中的特定文本文档 这不是问题 URL url getClass getResource zipfile ZipFile zip new ZipFile url g
  • 序列或批处理项目 DataGridView

    我有一个包含 940000 行的大型 DataGridView 哎呀 通过解析 csv 文件填充 DataGridView 有一个名为序列的列 编号为 1 到 940000 我试图做的是重新编号序列以溢出到序列中DataGridView 中