c# - 多个数据库提供程序的批量插入
问题描述
我是 donet 的新手,我正在尝试找到一种将数据库从 c# 写入数据库提供程序的方法。数据来自 json 文件,其中包含插入过程的所有必要信息(表名、列名、类型(作为字符串)和数据)。由于数据量可能会变得很大,我想避免为每一行创建一个新的插入语句。是否有适用于所有数据库提供程序的方法?
从反序列化的 json 文件中,我首先创建了一个 DbType 数组,其中包含每列的数据类型。
有了这个,我试图通过
使用 stringbuilder 构建 INSERT 语句
构建 DbCommand 并为其提供所有信息
执行创建的 DbCommand
using (IDbConnection connection = dbFactory.CreateConnection())
{
foreach (TableDTO table in dbTables)
{
//build the insert statement
StringBuilder insertSQLBuilder = new StringBuilder();
insertSQLBuilder.Append("INSERT INTO " + table.Name + "(");
foreach (ColumnDTO column in table.Columns)
{
insertSQLBuilder.Append(column.Name + ", ");
}
insertSQLBuilder.Length = insertSQLBuilder.Length - 2;
insertSQLBuilder.Append(") VALUES (");
for (int i = 0; i < table.Columns.Length; i++) {
insertSQLBuilder.Append("@param" + i + ", ");
}
insertSQLBuilder.Length = insertSQLBuilder.Length - 2;
insertSQLBuilder.Append(")");
//prepare the insert command
using (IDbCommand dbCommand = connection.CreateCommand()) {
dbCommand.CommandText = insertSQLBuilder.ToString();
IDbDataParameter[] dbParameters = new DbParameter[table.Columns.Length];
for (int i = 0; i < table.Columns.Length; i++)
{
IDbDataParameter dbParameter = dbCommand.CreateParameter();
dbParameter.DbType = typeArray[i]; //DbType Array, which holds the types for each column
dbParameter.ParameterName = "param" + i;
dbParameters[i] = dbParameter;
}
while (dataDeserializer.MoveNext())
{
// get new row from json file, each element of ColumnData holds the value and extra information which is not needed here
ColumnData[] columnData = dataDeserializer.Current;
for (int i = 0; i < dbParameters.Length; i++)
{
bool isNotGuid = typeArray[i] != DbType.Guid;
object value = null;
//TODO stupid conversion workaround
if (isNotGuid)
{
value = columnData[i].Value;
}
else
{
value = Guid.Parse(columnData[i].Value);
}
dbParameters[i].Value = value ?? DBNull.Value;
dbCommand.Parameters.Add(dbParameters[i]);
}
//execute statement and close connection
dbCommand.Connection.Open();
dbCommand.ExecuteNonQuery();
dbCommand.Connection.Close();
dbCommand.Parameters.Clear();
}
}
}
}
我想做的是在不指定数据库提供程序的情况下规避对数据库的单个插入调用。是否有支持多个提供者批量插入的库?一个完美的场景是一个库,它允许我只更改参数的值以及应该一次插入的行的最大计数(以控制内存使用)。
解决方案
推荐阅读
- javascript - 为什么我在使用 bcrypt 登录用户时收到 400 错误?
- reactjs - 使用某些道具触发 useEffect() React hook,但在效果中引用其他道具
- c++ - 映射二维数组以进行寻路的最佳方法?
- python - 使用 % 运算符在 python 中打印浮点数
- php - 在 Wordpress 网站上引用 MYSQL 数据库中的数据
- amazon-web-services - 从 Github 获取 AWS CodeDeploy 到 Auto Scale Group 的最新提交
- javascript - 过渡属性的跳跃行为
- java - 条形图左右移动
- linux - 构建内核模块时如何链接静态库?
- laravel - 添加修订后自动更改状态