diff --git a/Src/Asp.Net/DmTest/DmTest.csproj b/Src/Asp.Net/DmTest/DmTest.csproj
index 415f4961f..66fb51d02 100644
--- a/Src/Asp.Net/DmTest/DmTest.csproj
+++ b/Src/Asp.Net/DmTest/DmTest.csproj
@@ -33,6 +33,10 @@
4
+
+ False
+ ..\SqlSugar\References\DmProvider.dll
+
diff --git a/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/Private.cs b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/Private.cs
index a44725d9b..9cecf255f 100644
--- a/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/Private.cs
+++ b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/Private.cs
@@ -30,7 +30,7 @@ namespace SqlSugar
resultConnector.CharacterSet = this.CharacterSet;
return resultConnector;
case DbType.Dm:
- break;
+ return new DmFastBuilder();
case DbType.Kdbndp:
break;
case DbType.Oscar:
diff --git a/Src/Asp.Net/SqlSugar/Realization/Dm/SqlBuilder/DmBlukCopy.cs b/Src/Asp.Net/SqlSugar/Realization/Dm/SqlBuilder/DmBlukCopy.cs
new file mode 100644
index 000000000..a1d59330b
--- /dev/null
+++ b/Src/Asp.Net/SqlSugar/Realization/Dm/SqlBuilder/DmBlukCopy.cs
@@ -0,0 +1,154 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.SqlClient;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SqlSugar
+{
+ public class DmBlukCopy
+ {
+ internal List> DbColumnInfoList { get; set; }
+ internal SqlSugarProvider Context { get; set; }
+ internal ISqlBuilder Builder { get; set; }
+ internal InsertBuilder InsertBuilder { get; set; }
+ internal object[] Inserts { get; set; }
+
+ public int ExecuteBulkCopy()
+ {
+ if (DbColumnInfoList == null || DbColumnInfoList.Count == 0) return 0;
+
+ if (Inserts.First().GetType() == typeof(DataTable))
+ {
+ return WriteToServer();
+ }
+ DataTable dt = GetCopyData();
+ SqlBulkCopy bulkCopy = GetBulkCopyInstance();
+ bulkCopy.DestinationTableName = InsertBuilder.GetTableNameString;
+ try
+ {
+ bulkCopy.WriteToServer(dt);
+ }
+ catch (Exception ex)
+ {
+ CloseDb();
+ throw ex;
+ }
+ CloseDb();
+ return DbColumnInfoList.Count;
+ }
+
+ public async Task ExecuteBulkCopyAsync()
+ {
+ if (DbColumnInfoList == null || DbColumnInfoList.Count == 0) return 0;
+
+ if (Inserts.First().GetType() == typeof(DataTable))
+ {
+ return WriteToServer();
+ }
+ DataTable dt=GetCopyData();
+ SqlBulkCopy bulkCopy = GetBulkCopyInstance();
+ bulkCopy.DestinationTableName = InsertBuilder.GetTableNameString;
+ try
+ {
+ await bulkCopy.WriteToServerAsync(dt);
+ }
+ catch (Exception ex)
+ {
+ CloseDb();
+ throw ex;
+ }
+ CloseDb();
+ return DbColumnInfoList.Count;
+ }
+
+ private int WriteToServer()
+ {
+ var dt = this.Inserts.First() as DataTable;
+ if (dt == null)
+ return 0;
+ Check.Exception(dt.TableName == "Table", "dt.TableName can't be null ");
+ dt = GetCopyWriteDataTable(dt);
+ SqlBulkCopy copy = GetBulkCopyInstance();
+ copy.DestinationTableName = this.Builder.GetTranslationColumnName(dt.TableName);
+ copy.WriteToServer(dt);
+ CloseDb();
+ return dt.Rows.Count;
+ }
+ private DataTable GetCopyWriteDataTable(DataTable dt)
+ {
+ var result = this.Context.Ado.GetDataTable("select top 0 * from " + this.Builder.GetTranslationColumnName(dt.TableName));
+ foreach (DataRow item in dt.Rows)
+ {
+ DataRow dr= result.NewRow();
+ foreach (DataColumn column in result.Columns)
+ {
+
+ if (dt.Columns.Cast().Select(it => it.ColumnName.ToLower()).Contains(column.ColumnName.ToLower()))
+ {
+ dr[column.ColumnName] = item[column.ColumnName];
+ if (dr[column.ColumnName] == null)
+ {
+ dr[column.ColumnName] = DBNull.Value;
+ }
+ }
+ }
+ result.Rows.Add(dr);
+ }
+ result.TableName = dt.TableName;
+ return result;
+ }
+ private SqlBulkCopy GetBulkCopyInstance()
+ {
+ SqlBulkCopy copy;
+ if (this.Context.Ado.Transaction == null)
+ {
+ copy = new SqlBulkCopy((SqlConnection)this.Context.Ado.Connection);
+ }
+ else
+ {
+ copy = new SqlBulkCopy((SqlConnection)this.Context.Ado.Connection, SqlBulkCopyOptions.CheckConstraints, (SqlTransaction)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;
+ }
+ private DataTable GetCopyData()
+ {
+ var dt = this.Context.Ado.GetDataTable("select top 0 * from " + InsertBuilder.GetTableNameString);
+ foreach (var rowInfos in DbColumnInfoList)
+ {
+ var dr = dt.NewRow();
+ foreach (var value in rowInfos)
+ {
+ if (value.Value != null && UtilMethods.GetUnderType(value.Value.GetType()) == UtilConstants.DateType)
+ {
+ if (value.Value != null && value.Value.ToString() == DateTime.MinValue.ToString())
+ {
+ value.Value = Convert.ToDateTime("1753/01/01");
+ }
+ }
+ if (value.Value == null)
+ {
+ value.Value = DBNull.Value;
+ }
+ dr[value.DbColumnName] = value.Value;
+ }
+ dt.Rows.Add(dr);
+ }
+ return dt;
+ }
+ private void CloseDb()
+ {
+ if (this.Context.CurrentConnectionConfig.IsAutoCloseConnection && this.Context.Ado.Transaction == null)
+ {
+ this.Context.Ado.Connection.Close();
+ }
+ }
+ }
+}
diff --git a/Src/Asp.Net/SqlSugar/Realization/Dm/SqlBuilder/DmFastBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/Dm/SqlBuilder/DmFastBuilder.cs
new file mode 100644
index 000000000..0a1e1318a
--- /dev/null
+++ b/Src/Asp.Net/SqlSugar/Realization/Dm/SqlBuilder/DmFastBuilder.cs
@@ -0,0 +1,56 @@
+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 ExecuteBulkCopyAsync(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;
+ }
+
+ }
+}
diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj
index 519c0c483..fefe821ae 100644
--- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj
+++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj
@@ -200,6 +200,8 @@
+
+