修改海量数据库mysql BulkCopyAsync兼容性问题

This commit is contained in:
陈剑辉
2025-10-28 13:49:35 +08:00
parent 4b4aa7b3be
commit fa7b38119d

View File

@@ -11,7 +11,7 @@ namespace SqlSugar
{ {
public class PostgreSQLFastBuilder : FastBuilder, IFastBuilder public class PostgreSQLFastBuilder : FastBuilder, IFastBuilder
{ {
public static Dictionary<string , NpgsqlDbType> PgSqlType = UtilMethods.EnumToDictionary<NpgsqlDbType>(); public static Dictionary<string, NpgsqlDbType> PgSqlType = UtilMethods.EnumToDictionary<NpgsqlDbType>();
private EntityInfo entityInfo; private EntityInfo entityInfo;
public PostgreSQLFastBuilder(EntityInfo entityInfo) public PostgreSQLFastBuilder(EntityInfo entityInfo)
@@ -38,8 +38,10 @@ namespace SqlSugar
{ {
lsColNames.Add($"\"{dt.Columns[i].ColumnName}\""); lsColNames.Add($"\"{dt.Columns[i].ColumnName}\"");
} }
string copyString = $"COPY {dt.TableName} ( {string.Join(",", lsColNames) } ) FROM STDIN (FORMAT BINARY)"; string copyString = $"COPY {dt.TableName} ( {string.Join(",", lsColNames)} ) FROM STDIN (FORMAT BINARY)";
if (this.Context?.CurrentConnectionConfig?.MoreSettings?.DatabaseModel == DbType.OpenGauss) var innertemp = this.Context.CurrentConnectionConfig?.MoreSettings?.InnerTemp as DbType?;
if (this.Context?.CurrentConnectionConfig?.MoreSettings?.DatabaseModel == DbType.OpenGauss ||
(this.Context?.CurrentConnectionConfig?.MoreSettings?.DatabaseModel == DbType.Vastbase && innertemp == DbType.MySql))
{ {
copyString = copyString.Replace("(FORMAT BINARY)", "(FORMAT 'BINARY')"); copyString = copyString.Replace("(FORMAT BINARY)", "(FORMAT 'BINARY')");
} }
@@ -58,14 +60,14 @@ namespace SqlSugar
{ {
throw ex; throw ex;
} }
finally finally
{ {
base.CloseDb(); base.CloseDb();
} }
return await Task.FromResult(dt.Rows.Count); return await Task.FromResult(dt.Rows.Count);
} }
private void BulkCopy(DataTable dt, string copyString, NpgsqlConnection conn, List<DbColumnInfo> columns) private void BulkCopy(DataTable dt, string copyString, NpgsqlConnection conn, List<DbColumnInfo> columns)
{ {
if (conn.State == ConnectionState.Closed) if (conn.State == ConnectionState.Closed)
conn.Open(); conn.Open();
@@ -75,9 +77,9 @@ namespace SqlSugar
ColumnView result = new ColumnView(); ColumnView result = new ColumnView();
result.DbColumnInfo = columns.FirstOrDefault(it => it.DbColumnName.EqualCase(item.ColumnName)); result.DbColumnInfo = columns.FirstOrDefault(it => it.DbColumnName.EqualCase(item.ColumnName));
result.DataColumn = item; result.DataColumn = item;
result.EntityColumnInfo=this.entityInfo.Columns.FirstOrDefault(it => it.DbColumnName.EqualCase(item.ColumnName)); result.EntityColumnInfo = this.entityInfo.Columns.FirstOrDefault(it => it.DbColumnName.EqualCase(item.ColumnName));
var key = result.DbColumnInfo?.DataType?.ToLower(); var key = result.DbColumnInfo?.DataType?.ToLower();
if (result.DbColumnInfo == null) if (result.DbColumnInfo == null)
{ {
result.Type = null; result.Type = null;
} }
@@ -88,7 +90,7 @@ namespace SqlSugar
else if (key?.First() == '_') else if (key?.First() == '_')
{ {
if (key == "_int4") if (key == "_int4")
{ {
result.Type = NpgsqlDbType.Array | NpgsqlDbType.Integer; result.Type = NpgsqlDbType.Array | NpgsqlDbType.Integer;
} }
else if (key == "_int2") else if (key == "_int2")
@@ -135,20 +137,20 @@ namespace SqlSugar
{ {
writer.Write(value); writer.Write(value);
} }
else else
{ {
writer.Write(value, column.Type.Value); writer.Write(value, column.Type.Value);
} }
} }
} }
writer.Complete(); writer.Complete();
} }
} }
public override async Task<int> UpdateByTempAsync(string tableName, string tempName, string[] updateColumns, string[] whereColumns) public override async Task<int> UpdateByTempAsync(string tableName, string tempName, string[] updateColumns, string[] whereColumns)
{ {
var sqlquerybulder= this.Context.Queryable<object>().SqlBuilder; var sqlquerybulder = this.Context.Queryable<object>().SqlBuilder;
Check.ArgumentNullException(!updateColumns.Any(), "update columns count is 0"); Check.ArgumentNullException(!updateColumns.Any(), "update columns count is 0");
Check.ArgumentNullException(!whereColumns.Any(), "where columns count is 0"); Check.ArgumentNullException(!whereColumns.Any(), "where columns count is 0");
var sets = string.Join(",", updateColumns.Select(it => $"{sqlquerybulder.GetTranslationColumnName(it)}=TE.{sqlquerybulder.GetTranslationColumnName(it)}")); var sets = string.Join(",", updateColumns.Select(it => $"{sqlquerybulder.GetTranslationColumnName(it)}=TE.{sqlquerybulder.GetTranslationColumnName(it)}"));
@@ -156,7 +158,7 @@ namespace SqlSugar
string sql = string.Format(UpdateSql, sets, tableName, tempName, wheres); string sql = string.Format(UpdateSql, sets, tableName, tempName, wheres);
return await this.Context.Ado.ExecuteCommandAsync(sql); return await this.Context.Ado.ExecuteCommandAsync(sql);
} }
public override async Task CreateTempAsync<T>(DataTable dt) public override async Task CreateTempAsync<T>(DataTable dt)
{ {
await this.Context.Queryable<T>().Where(it => false).AS(dt.TableName).Select(" * into temp mytemptable").ToListAsync(); await this.Context.Queryable<T>().Where(it => false).AS(dt.TableName).Select(" * into temp mytemptable").ToListAsync();
dt.TableName = "mytemptable"; dt.TableName = "mytemptable";