gpt4 book ai didi

c# - 来自 MS.NET 的关系表的 MySQL 批量插入

转载 作者:行者123 更新时间:2023-11-29 07:38:03 25 4
gpt4 key购买 nike

我想使用 C# 执行从 CSV 到 MySQL 数据库的批量插入,我正在使用 MySql.Data.MySqlClient 进行连接。 CSV 列被引用到多个表中,它们依赖于主键值,例如,

CSV(列和值):-

emp_name, address,country
-------------------------------
jhon,new york,usa
amanda,san diago,usa
Brad,london,uk

数据库架构(CountryTbl)和值(value)

country_Id,Country_Name
1,usa
2,UK
3,Germany

数据库架构(员工表)

Emp_Id(AutoIncrement),Emp_Name

数据库架构(地址表)

Address_Id(AutoIncrement), Emp_Id,Address,countryid

问题陈述:

1> 从 CSV 中读取数据以从“CountryTbl”中获取各个员工的 CountryId。

2>用CountryId向EmployeeTbl和AddressTbl中插入数据

方法一

按照上述问题陈述步骤进行,但这会影响性能(逐行读取和插入)

方法二

使用“批量插入”选项“MySqlBulkLoader”,但这需要读取 csv 文件,看起来这个选项对我不起作用。

方法 3

使用存储过程并使用上传过程。但我不想使用存储过程。

请建议我是否可以通过任何其他选项进行批量上传或建议任何其他方法。

最佳答案

除非您要上传数十万行,否则批量加载(您的方法 2)可能不值得花费额外的编程和调试时间。这是我的看法,物有所值(是您为此付出的代价的 2 倍 :)

方法 1 和 3 大致相同。区别在于您是从 c# 还是从 sp 发出查询。您仍然需要计算出查询。因此,让我们处理 1。

这类问题的解决方案取决于 RDBMS 的品牌和型号。如果您决定要迁移到 SQL Server,则必须更改这些内容。

这就是你要做的。对于您的员工 csv 的每一行 ...

...将一行放入员工表

 INSERT INTO EmployeeTbl (Emp_Name) VALUES (@emp_name);

请注意,此查询使用插入查询的 INSERT ... VALUES 形式。当此查询(或任何插入查询)运行时,它会丢弃自动递增的 Emp_Id 值,随后调用 LAST_INSERT_ID() 可以获得它。

...向地址表中放入一行

INSERT INTO AddressTbl (Emp_Id,Address,countryid)
SELECT LAST_INSERT_ID() AS Emp_Id,
@address AS Address,
country_id AS countryid
FROM CountryTbl
WHERE Country_Name = @country;

请注意,第二个 INSERT 使用插入查询的 INSERT ... SELECT 形式。所有这一切的 SELECT 部分生成一行数据,其中包含要插入的列值。

  • 它使用LAST_INSERT_ID() 获取Emp_Id,
  • 它使用您的 C# 程序为 @address 提供的常量,并且
  • 它从您预先存在的 CountryTbl 中查找 countryid 值。

当然,请注意,您必须使用 the C# Parameters.AddWithValue() method在这些查询中设置 @ 参数的值。这些值来自您的 CSV 文件。

最后,将每千行左右的 csv 包装在 transaction 中,通过在它们的 INSERT 语句之前加上 START TRANSACTION; 语句并以 COMMIT; 语句结束它们。这将使您的性能得到提升,如果出现问题,整个事务将被回滚,以便您可以重新开始。

关于c# - 来自 MS.NET 的关系表的 MySQL 批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47832884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com