sqlsugar/Src/Asp.Net/SqlSugar/Realization/Dm/SqlBuilder/DmFastBuilder.cs

100 lines
3.5 KiB
C#
Raw Permalink Normal View History

2025-05-11 16:20:50 +08:00
using Dm;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SqlSugar
{
public class DmFastBuilder:FastBuilder,IFastBuilder
{
public override bool IsActionUpdateColumns { get; set; } = true;
public override DbFastestProperties DbFastestProperties { get; set; } = new DbFastestProperties() {
HasOffsetTime=true
};
public async Task<int> ExecuteBulkCopyAsync(DataTable dt)
{
if (DbFastestProperties?.IsOffIdentity == true)
{
var isNoTran = this.Context.Ado.IsNoTran()&&this.Context.CurrentConnectionConfig.IsAutoCloseConnection;
try
{
if(isNoTran)
this.Context.Ado.BeginTran();
this.Context.Ado.ExecuteCommand($"SET IDENTITY_INSERT {dt.TableName} ON");
var result=await _Execute(dt);
this.Context.Ado.ExecuteCommand($"SET IDENTITY_INSERT {dt.TableName} OFF");
if (isNoTran)
this.Context.Ado.CommitTran();
return result;
}
catch (Exception)
{
if (isNoTran)
this.Context.Ado.CommitTran();
throw;
}
}
else
{
return await _Execute(dt);
}
}
public override async Task CreateTempAsync<T>(DataTable dt)
{
var queryable = this.Context.Queryable<T>();
var tableName = queryable.SqlBuilder.GetTranslationTableName(dt.TableName);
var sqlBuilder = this.Context.Queryable<object>().SqlBuilder;
var dts = dt.Columns.Cast<DataColumn>().Select(it => sqlBuilder.GetTranslationColumnName(it.ColumnName)).ToList();
dt.TableName = "temp" + SnowFlakeSingle.instance.getID();
var sql = queryable.AS(tableName).Where(it => false).Select(string.Join(",", dts)).ToSql().Key;
await this.Context.Ado.ExecuteCommandAsync($"CREATE TABLE {dt.TableName} as ( {sql} ) ");
}
public override string UpdateSql { get; set; } = @"UPDATE {1} TM INNER JOIN {2} TE ON {3} SET {0} ";
private async Task<int> _Execute(DataTable dt)
{
DmBulkCopy bulkCopy = GetBulkCopyInstance();
bulkCopy.DestinationTableName = dt.TableName;
try
{
bulkCopy.WriteToServer(dt);
await Task.Delay(0);//No Support Async
}
catch (Exception ex)
{
CloseDb();
throw ex;
}
CloseDb();
return dt.Rows.Count;
}
public DmBulkCopy GetBulkCopyInstance()
{
DmBulkCopy copy;
if (this.Context.Ado.Transaction == null)
{
copy = new DmBulkCopy((DmConnection)this.Context.Ado.Connection);
}
else
{
copy = new DmBulkCopy((DmConnection)this.Context.Ado.Connection, DmBulkCopyOptions.Default, (DmTransaction)this.Context.Ado.Transaction);
}
if (this.Context.Ado.Connection.State == ConnectionState.Closed)
{
this.Context.Ado.Connection.Open();
}
copy.BulkCopyTimeout = this.Context.Ado.CommandTimeOut;
return copy;
}
}
}