Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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
C# 从多个文件快速插入原始二进制数据以访问数据库_C#_Sql_Database_Ms Access_Ado.net - Fatal编程技术网

C# 从多个文件快速插入原始二进制数据以访问数据库

C# 从多个文件快速插入原始二进制数据以访问数据库,c#,sql,database,ms-access,ado.net,C#,Sql,Database,Ms Access,Ado.net,我正在寻找从多个二进制文件读取并在多个表中的单个MS Access数据库中写入所有内容的最快方法。SQL Server或任何其他数据库都不是选项。我用的是C 假设我只有一个包含1GB数据的文件 文件以标题(包含列名代码)开头,后跟700000多个测量数据块。标头长度小于100字节。一个数据块的长度为1500字节(372 x单浮点+12字节表示日期和时间) 必须在第一个数据库表中插入前84个单个值 其余288个单一值在9个表中平均分配,每个表32个值 每个表行都有时间和日期作为第一列 现在,我使用

我正在寻找从多个二进制文件读取并在多个表中的单个MS Access数据库中写入所有内容的最快方法。SQL Server或任何其他数据库都不是选项。我用的是C

假设我只有一个包含1GB数据的文件

  • 文件以标题(包含列名代码)开头,后跟700000多个测量数据块。标头长度小于100字节。一个数据块的长度为1500字节(372 x单浮点+12字节表示日期和时间)

  • 必须在第一个数据库表中插入前84个单个值

  • 其余288个单一值在9个表中平均分配,每个表32个值
  • 每个表行都有时间和日期作为第一列
  • 现在,我使用的是二进制读取器。我正在逐块读取,并在每个块执行INSERT语句(ADO.NET)10次。这将是超过700万的插入

    1.5MB的执行时间约为1分钟-1GB将超过10小时


    有什么方法可以更快地完成这项工作吗?您认为可以期待什么?

    您可能正在提交每一次插入。最好开始一个事务,处理一些固定数量的数据块,比如100或500,然后提交事务并开始另一个事务。保留已提交记录的文本文件日志,以便在出于某种原因需要重新启动时知道从何处开始

    您可以尝试更改Jet引擎属性以进行同步,但最好是在连接上简单地开始一个SQL事务,然后在大量记录之后提交。您还需要像中一样打开自动提交


    此外,如果指定了排序键,则撤消该操作。加载所有数据后,使用ADOX使它们成为索引键。

    您应该使用
    SqlBulkCopy

    谢谢你的重播,但我也没有找到StartTrans。我已经读取了所有数据并将其写入DataTable中。现在,我已经准备好将大型数据表插入mdb文件中。我发现很少有线程建议使用od Microsoft DAO 3.6对象库或其他COM。您可以始终在SQL语句中执行事务,如这里所示,我刚刚尝试使用ADODB插入。我的执行时间提高了2倍,但还是太慢了。我试过使用BeginTrans/CommitTrans,但似乎没有效果。在BeginTrans之后,我将为DataTable中的每一行执行Insert语句。Execute方法花费了我声明的BeginTrans的很长时间(90%的处理时间)。提交在100毫秒内执行,因此没有启动新事务的必要。引用的URL中关于更改注册表设置的建议是非常糟糕的建议。这些设置(隐式CommitSync和UserCommitSync)不能设置为相反的设置,因为它们适用于不同的事物。有关这些设置应用于什么的完整说明,请参阅本文:我必须将数据写入Access数据库。SqlBulkCopy类只能用于将数据写入SQL Server表。