mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-08-24 07:22:57 +08:00
Oracle BulkcopyUpdate by datatable
This commit is contained in:
parent
c8144c0fcb
commit
7d35bbf02a
@ -232,7 +232,7 @@ namespace SqlSugar
|
||||
var isAuto = this.context.CurrentConnectionConfig.IsAutoCloseConnection;
|
||||
this.context.CurrentConnectionConfig.IsAutoCloseConnection = false;
|
||||
dataTable.TableName = this.queryable.SqlBuilder.GetTranslationTableName(tableName);
|
||||
DataTable dt = GetCopyWriteDataTable(dataTable);
|
||||
DataTable dt = GetCopyWriteDataTableUpdate(dataTable);
|
||||
IFastBuilder buider = GetBuider();
|
||||
if (dt.Columns.Count != dataTable.Columns.Count)
|
||||
{
|
||||
|
@ -212,7 +212,53 @@ namespace SqlSugar
|
||||
tempDataTable.TableName = dt.TableName;
|
||||
return tempDataTable;
|
||||
}
|
||||
private DataTable GetCopyWriteDataTableUpdate(DataTable dt)
|
||||
{
|
||||
var sqlBuilder = this.context.Queryable<object>().SqlBuilder;
|
||||
var dts = dt.Columns.Cast<DataColumn>().Select(it => sqlBuilder.GetTranslationColumnName(it.ColumnName)).ToList();
|
||||
DataTable tempDataTable = null;
|
||||
if (AsName == null)
|
||||
{
|
||||
tempDataTable = queryable.Where(it => false).Select(string.Join(",", dts)).ToDataTable();
|
||||
}
|
||||
else
|
||||
{
|
||||
tempDataTable = queryable.AS(AsName).Where(it => false).Select(string.Join(",", dts)).ToDataTable();
|
||||
};
|
||||
List<string> uInt64TypeName = new List<string>();
|
||||
foreach (DataColumn item in tempDataTable.Columns)
|
||||
{
|
||||
if (item.DataType == typeof(UInt64))
|
||||
{
|
||||
uInt64TypeName.Add(item.ColumnName);
|
||||
}
|
||||
}
|
||||
var temColumnsList = tempDataTable.Columns.Cast<DataColumn>().Select(it => it.ColumnName.ToLower()).ToList();
|
||||
var columns = dt.Columns.Cast<DataColumn>().Where(it => temColumnsList.Contains(it.ColumnName.ToLower())).ToList();
|
||||
foreach (DataRow item in dt.Rows)
|
||||
{
|
||||
DataRow dr = tempDataTable.NewRow();
|
||||
foreach (DataColumn column in columns)
|
||||
{
|
||||
|
||||
dr[column.ColumnName] = item[column.ColumnName];
|
||||
if (dr[column.ColumnName] == null || dr[column.ColumnName] == DBNull.Value)
|
||||
{
|
||||
dr[column.ColumnName] = DBNull.Value;
|
||||
}
|
||||
else if (column.DataType == UtilConstants.BoolType && this.context.CurrentConnectionConfig.DbType.IsIn(DbType.MySql, DbType.MySqlConnector))
|
||||
{
|
||||
if (Convert.ToBoolean(dr[column.ColumnName]) == false && uInt64TypeName.Any(z => z.EqualCase(column.ColumnName)))
|
||||
{
|
||||
dr[column.ColumnName] = DBNull.Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
tempDataTable.Rows.Add(dr);
|
||||
}
|
||||
tempDataTable.TableName = dt.TableName;
|
||||
return tempDataTable;
|
||||
}
|
||||
|
||||
private void RemoveCache()
|
||||
{
|
||||
|
@ -1,9 +1,7 @@
|
||||
using Oracle.ManagedDataAccess.Client;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SqlSugar
|
||||
@ -20,18 +18,29 @@ namespace SqlSugar
|
||||
public override string UpdateSql { get; set; } = "UPDATE (SELECT {4} FROM {2} TM,{3} TE WHERE {1})SET {0}";
|
||||
public override async Task CreateTempAsync<T>(DataTable dt)
|
||||
{
|
||||
var sqlBuilder = this.Context.Queryable<object>().SqlBuilder;
|
||||
var dts = dt.Columns.Cast<DataColumn>().Select(it => sqlBuilder.GetTranslationColumnName(it.ColumnName)).ToList();
|
||||
//await Task.FromResult(0);
|
||||
//throw new Exception("Oracle no support BulkUpdate");
|
||||
var oldTableName = dt.TableName;
|
||||
var columns = this.Context.EntityMaintenance.GetEntityInfo<T>().Columns.Where(it => it.IsPrimarykey).Select(it => it.DbColumnName).ToArray();
|
||||
var columns = this.Context.EntityMaintenance.GetEntityInfo<T>().Columns.Where(it => it.IsPrimarykey).Select(it => it.DbColumnName).ToList();
|
||||
dt.TableName = "Temp" + SnowFlakeSingle.instance.getID().ToString();
|
||||
var sql = this.Context.Queryable<T>().AS(oldTableName).Where(it => false).Select("*").ToSql().Key;
|
||||
await this.Context.Ado.ExecuteCommandAsync($"create table {dt.TableName} as {sql} ");
|
||||
if (columns != null && columns.Any())
|
||||
if (columns.Count() == 0)
|
||||
{
|
||||
this.Context.DbMaintenance.AddPrimaryKeys(dt.TableName, columns, "Pk_" + SnowFlakeSingle.instance.getID().ToString());
|
||||
var pkColumn = sqlBuilder.GetTranslationColumnName("sys_guid_Id");
|
||||
var pkColumnName = sqlBuilder.GetNoTranslationColumnName( sqlBuilder.GetTranslationColumnName("sys_guid_Id"));
|
||||
dts.Add("sys_guid() as " + pkColumn);
|
||||
dt.Columns.Add(pkColumnName,typeof(Guid));
|
||||
columns.Add(pkColumnName);
|
||||
foreach (DataRow item in dt.Rows)
|
||||
{
|
||||
item[pkColumnName] = Guid.NewGuid();
|
||||
}
|
||||
}
|
||||
var sql = this.Context.Queryable<T>().AS(oldTableName).Where(it => false).Select(string.Join(",", dts)).ToSql().Key;
|
||||
await this.Context.Ado.ExecuteCommandAsync($"create table {dt.TableName} as {sql} ");
|
||||
this.Context.DbMaintenance.AddPrimaryKeys(dt.TableName, columns.ToArray(), "Pk_" + SnowFlakeSingle.instance.getID().ToString());
|
||||
}
|
||||
public override async Task<int> UpdateByTempAsync(string tableName, string tempName, string[] updateColumns, string[] whereColumns)
|
||||
{
|
||||
var sqlBuilder = this.Context.Queryable<object>().SqlBuilder;
|
||||
@ -39,8 +48,8 @@ namespace SqlSugar
|
||||
Check.ArgumentNullException(!whereColumns.Any(), "where columns count is 0");
|
||||
var sets = string.Join(",", updateColumns.Select(it => $"TM{it}=TE{it}"));
|
||||
var wheres = string.Join(" AND ", whereColumns.Select(it => $"TM.{sqlBuilder.GetTranslationColumnName(it)}=TE.{sqlBuilder.GetTranslationColumnName(it)}"));
|
||||
var forms= string.Join(",", updateColumns.Select(it => $" TM.{sqlBuilder.GetTranslationColumnName(it)} TM{it},TE.{sqlBuilder.GetTranslationColumnName(it)} TE{it}")); ;
|
||||
string sql = string.Format(UpdateSql, sets, wheres,tableName, tempName, forms);
|
||||
var forms = string.Join(",", updateColumns.Select(it => $" TM.{sqlBuilder.GetTranslationColumnName(it)} TM{it},TE.{sqlBuilder.GetTranslationColumnName(it)} TE{it}")); ;
|
||||
string sql = string.Format(UpdateSql, sets, wheres, tableName, tempName, forms);
|
||||
return await this.Context.Ado.ExecuteCommandAsync(sql);
|
||||
}
|
||||
private OracleBulkCopy GetBulkCopyInstance()
|
||||
|
Loading…
Reference in New Issue
Block a user