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;
|
var isAuto = this.context.CurrentConnectionConfig.IsAutoCloseConnection;
|
||||||
this.context.CurrentConnectionConfig.IsAutoCloseConnection = false;
|
this.context.CurrentConnectionConfig.IsAutoCloseConnection = false;
|
||||||
dataTable.TableName = this.queryable.SqlBuilder.GetTranslationTableName(tableName);
|
dataTable.TableName = this.queryable.SqlBuilder.GetTranslationTableName(tableName);
|
||||||
DataTable dt = GetCopyWriteDataTable(dataTable);
|
DataTable dt = GetCopyWriteDataTableUpdate(dataTable);
|
||||||
IFastBuilder buider = GetBuider();
|
IFastBuilder buider = GetBuider();
|
||||||
if (dt.Columns.Count != dataTable.Columns.Count)
|
if (dt.Columns.Count != dataTable.Columns.Count)
|
||||||
{
|
{
|
||||||
|
@ -212,7 +212,53 @@ namespace SqlSugar
|
|||||||
tempDataTable.TableName = dt.TableName;
|
tempDataTable.TableName = dt.TableName;
|
||||||
return tempDataTable;
|
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()
|
private void RemoveCache()
|
||||||
{
|
{
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
using Oracle.ManagedDataAccess.Client;
|
using Oracle.ManagedDataAccess.Client;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace SqlSugar
|
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 string UpdateSql { get; set; } = "UPDATE (SELECT {4} FROM {2} TM,{3} TE WHERE {1})SET {0}";
|
||||||
public override async Task CreateTempAsync<T>(DataTable dt)
|
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);
|
//await Task.FromResult(0);
|
||||||
//throw new Exception("Oracle no support BulkUpdate");
|
//throw new Exception("Oracle no support BulkUpdate");
|
||||||
var oldTableName = dt.TableName;
|
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();
|
dt.TableName = "Temp" + SnowFlakeSingle.instance.getID().ToString();
|
||||||
var sql = this.Context.Queryable<T>().AS(oldTableName).Where(it => false).Select("*").ToSql().Key;
|
if (columns.Count() == 0)
|
||||||
await this.Context.Ado.ExecuteCommandAsync($"create table {dt.TableName} as {sql} ");
|
|
||||||
if (columns != null && columns.Any())
|
|
||||||
{
|
{
|
||||||
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)
|
public override async Task<int> UpdateByTempAsync(string tableName, string tempName, string[] updateColumns, string[] whereColumns)
|
||||||
{
|
{
|
||||||
var sqlBuilder = this.Context.Queryable<object>().SqlBuilder;
|
var sqlBuilder = this.Context.Queryable<object>().SqlBuilder;
|
||||||
@ -39,8 +48,8 @@ namespace SqlSugar
|
|||||||
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 => $"TM{it}=TE{it}"));
|
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 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}")); ;
|
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);
|
string sql = string.Format(UpdateSql, sets, wheres, tableName, tempName, forms);
|
||||||
return await this.Context.Ado.ExecuteCommandAsync(sql);
|
return await this.Context.Ado.ExecuteCommandAsync(sql);
|
||||||
}
|
}
|
||||||
private OracleBulkCopy GetBulkCopyInstance()
|
private OracleBulkCopy GetBulkCopyInstance()
|
||||||
|
Loading…
Reference in New Issue
Block a user