mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-12-05 03:17:41 +08:00
虚谷数据库
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
namespace SqlSugar.Xugu
|
||||
{
|
||||
public class XuguCodeFirst : CodeFirstProvider
|
||||
{
|
||||
protected override int DefultLength { get; set; } = -1;
|
||||
public virtual bool IsNoTran { get; set; } = true;
|
||||
public override void ExistLogic(EntityInfo entityInfo)
|
||||
{
|
||||
base.ExistLogic(entityInfo);
|
||||
//this.Context.Ado.ExecuteCommand("select '不支持修改表' from dual ");
|
||||
}
|
||||
protected override void ConvertColumns(List<DbColumnInfo> dbColumns)
|
||||
{
|
||||
dbColumns.ForEach(d => { d.Length = 0;d.IsNullable = false; });
|
||||
}
|
||||
protected override bool IsNoSamgeType(EntityColumnInfo ec, DbColumnInfo dc)
|
||||
{
|
||||
var o = new DbColumnInfo();
|
||||
GetDbType(ec, UtilMethods.GetUnderType(ec.PropertyInfo), o);
|
||||
ec.DataType = o.DataType;
|
||||
//if (ec.UnderType == UtilConstants.GuidType) ec.Length = 32;
|
||||
if (ec.UnderType == UtilConstants.ByteArrayType) ec.DataType = "BINARY";
|
||||
if (ec.UnderType == UtilConstants.DateType) ec.DataType = "DATETIME";
|
||||
if (ec.UnderType == UtilConstants.DateTimeOffsetType) ec.DataType = "DATETIME WITH TIME ZONE";
|
||||
if (ec.UnderType == UtilConstants.FloatType) ec.DataType = "FLOAT";
|
||||
if (ec.UnderType == UtilConstants.DecType) ec.DataType = "DECIMAL";
|
||||
if (ec.UnderType == UtilConstants.StringType) ec.DataType = "VARCHAR";
|
||||
if (ec.UnderType == typeof(Version)) ec.DataType = "ROWVERSION";
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(ec.DataType)) ec.DataType = ec.DataType.ToUpper();
|
||||
ec.IsNullable = Nullable.GetUnderlyingType(ec.PropertyInfo.PropertyType) != null
|
||||
|| !ec.PropertyInfo.PropertyType.IsValueType
|
||||
|| !UtilConstants.NumericalTypes.Contains(ec.PropertyInfo.PropertyType);
|
||||
|
||||
return base.IsNoSamgeType(ec, dc);
|
||||
}
|
||||
|
||||
protected override DbColumnInfo EntityColumnToDbColumn(EntityInfo entityInfo, string tableName, EntityColumnInfo item)
|
||||
{
|
||||
var result = base.EntityColumnToDbColumn(entityInfo, tableName, item);
|
||||
//if (item.UnderType == UtilConstants.GuidType) result.Length = 32;
|
||||
if (item.UnderType == UtilConstants.ByteArrayType) result.DataType = "BINARY";
|
||||
if (item.UnderType == UtilConstants.DateType) result.DataType = "DATETIME";
|
||||
if (item.UnderType == UtilConstants.DateTimeOffsetType) result.DataType = "DATETIME WITH TIME ZONE";
|
||||
if (item.UnderType == UtilConstants.FloatType) result.DataType = "FLOAT";
|
||||
if (item.UnderType == UtilConstants.DecType) result.DataType = "DECIMAL";
|
||||
if (item.UnderType == UtilConstants.StringType) result.DataType = "VARCHAR";
|
||||
if (item.UnderType == typeof(Version)) result.DataType = "ROWVERSION";
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(item.DataType)) result.DataType = item.DataType.ToUpper();
|
||||
result.IsNullable = Nullable.GetUnderlyingType(item.PropertyInfo.PropertyType) != null
|
||||
|| !item.PropertyInfo.PropertyType.IsValueType
|
||||
|| !UtilConstants.NumericalTypes.Contains(item.PropertyInfo.PropertyType);
|
||||
return result;
|
||||
}
|
||||
protected override string GetTableName(EntityInfo entityInfo)
|
||||
{
|
||||
var table = this.Context.EntityMaintenance.GetTableName(entityInfo.EntityName);
|
||||
var tableArray = table.Split('.');
|
||||
var noFormat = table.Split(']').Length == 1;
|
||||
if (tableArray.Length > 1 && noFormat)
|
||||
{
|
||||
var dbMain = new XuguDbMaintenance() { Context = this.Context };
|
||||
return dbMain.SqlBuilder.GetTranslationTableName(table);
|
||||
}
|
||||
return table;
|
||||
}
|
||||
|
||||
protected override void ExistLogicEnd(List<EntityColumnInfo> dbColumns)
|
||||
{
|
||||
foreach (EntityColumnInfo column in dbColumns)
|
||||
{
|
||||
if (column.DefaultValue != null)
|
||||
{
|
||||
this.Context.DbMaintenance.AddDefaultValue(column.DbTableName, column.DbColumnName, column.DefaultValue.ToSqlValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override void ChangeKey(EntityInfo entityInfo, string tableName, EntityColumnInfo item)
|
||||
{
|
||||
this.Context.DbMaintenance.UpdateColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item));
|
||||
string keyName = this.Context.Ado.GetString(@$"SELECT I.INDEX_NAME FROM USER_INDEXES I
|
||||
LEFT JOIN USER_TABLES T ON I.TABLE_ID=T.TABLE_ID
|
||||
WHERE T.TABLE_NAME='{tableName}' AND FIND_IN_SET('""{item.DbColumnName}""',I.KEYS)>0 AND T.DB_ID=CURRENT_DB_ID
|
||||
AND T.USER_ID=CURRENT_USERID AND T.SCHEMA_ID=CURRENT_SCHEMAID");
|
||||
if (!item.IsPrimarykey && !string.IsNullOrWhiteSpace(keyName))
|
||||
this.Context.DbMaintenance.DropConstraint(tableName, keyName);
|
||||
if (item.IsPrimarykey)
|
||||
this.Context.DbMaintenance.AddPrimaryKey(tableName, item.DbColumnName);
|
||||
}
|
||||
}
|
||||
}
|
||||
102
Src/Asp.NetCore2/SqlSugar.XuguCore/Xugu/DbBind/XuguDbBind.cs
Normal file
102
Src/Asp.NetCore2/SqlSugar.XuguCore/Xugu/DbBind/XuguDbBind.cs
Normal file
@@ -0,0 +1,102 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
namespace SqlSugar.Xugu
|
||||
{
|
||||
public class XuguDbBind : DbBindProvider
|
||||
{
|
||||
public override string GetDbTypeName(string csharpTypeName) => csharpTypeName == nameof(DateTimeOffset) ? nameof(DateTimeOffset) : base.GetDbTypeName(csharpTypeName);
|
||||
public override List<KeyValuePair<string, CSharpDataType>> MappingTypes
|
||||
{
|
||||
get
|
||||
{
|
||||
var extService = this.Context.CurrentConnectionConfig.ConfigureExternalServices;
|
||||
if (extService != null && extService.AppendDataReaderTypeMappings.HasValue())
|
||||
return extService.AppendDataReaderTypeMappings.Union(MappingTypesConst).ToList();
|
||||
else
|
||||
return MappingTypesConst;
|
||||
}
|
||||
}
|
||||
public static List<KeyValuePair<string, CSharpDataType>> MappingTypesConst = new List<KeyValuePair<string, CSharpDataType>>()
|
||||
{
|
||||
new KeyValuePair<string, CSharpDataType>("BIGINT",CSharpDataType.@long),
|
||||
new KeyValuePair<string, CSharpDataType>("BINARY",CSharpDataType.@byteArray),
|
||||
new KeyValuePair<string, CSharpDataType>("BLOB",CSharpDataType.@object),
|
||||
new KeyValuePair<string, CSharpDataType>("BOOLEAN",CSharpDataType.@bool),
|
||||
new KeyValuePair<string, CSharpDataType>("CHAR",CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("CLOB",CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("DATE", CSharpDataType.DateTime),
|
||||
new KeyValuePair<string, CSharpDataType>("DATETIME", CSharpDataType.DateTime),
|
||||
new KeyValuePair<string, CSharpDataType>("DATETIME WITH TIME ZONE", CSharpDataType.DateTimeOffset),
|
||||
new KeyValuePair<string, CSharpDataType>("DECIMAL", CSharpDataType.@decimal),
|
||||
new KeyValuePair<string, CSharpDataType>("DOUBLE", CSharpDataType.@double),
|
||||
new KeyValuePair<string, CSharpDataType>("FLOAT", CSharpDataType.@float),
|
||||
new KeyValuePair<string, CSharpDataType>("GUID", CSharpDataType.Guid),
|
||||
new KeyValuePair<string, CSharpDataType>("INT", CSharpDataType.@int),
|
||||
new KeyValuePair<string, CSharpDataType>("INTEGER", CSharpDataType.@int),
|
||||
new KeyValuePair<string, CSharpDataType>("INTERVAL YEAR", CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("INTERVAL YEAR TO MONTH", CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("INTERVAL MONTH", CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("INTERVAL DAY", CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("INTERVAL DAY TO HOUR", CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("INTERVAL DAY TO MINUTE", CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("INTERVAL DAY TO SECOND", CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("INTERVAL HOUR", CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("INTERVAL HOUR TO MINUTE", CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("INTERVAL HOUR TO SECOND", CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("INTERVAL MINUTE", CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("INTERVAL MINUTE TO SECOND", CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("INTERVAL SECOND", CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("NCHAR", CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("NUMERIC", CSharpDataType.@decimal),
|
||||
new KeyValuePair<string, CSharpDataType>("NVARCHAR", CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("ROWID", CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("ROWVERSION", CSharpDataType.@object),//需要手动修改为System.Version
|
||||
new KeyValuePair<string, CSharpDataType>("TIME", CSharpDataType.TimeSpan),
|
||||
new KeyValuePair<string, CSharpDataType>("TIME WITH TIME ZONE", CSharpDataType.TimeSpan),
|
||||
new KeyValuePair<string, CSharpDataType>("TIMESTAMP", CSharpDataType.DateTime),
|
||||
new KeyValuePair<string, CSharpDataType>("TIMESTAMP AUTO UPDATE", CSharpDataType.DateTime),
|
||||
new KeyValuePair<string, CSharpDataType>("TINYINT", CSharpDataType.@sbyte),
|
||||
new KeyValuePair<string, CSharpDataType>("VARCHAR", CSharpDataType.@string),
|
||||
};
|
||||
};
|
||||
|
||||
public class DateTimeOffsetConvert : ISugarDataConverter
|
||||
{
|
||||
public SugarParameter ParameterConverter<T>(object columnValue, int columnIndex)
|
||||
{
|
||||
string name = ":XuguParam" + columnIndex;
|
||||
Type underType = UtilMethods.GetUnderType(typeof(T));
|
||||
return new SugarParameter(name, columnValue, underType);
|
||||
}
|
||||
public T QueryConverter<T>(IDataRecord dr, int i)
|
||||
{
|
||||
var value = dr.GetString(i);
|
||||
if (DateTimeOffset.TryParse(value, out DateTimeOffset o)) return (T)UtilMethods.ChangeType2(o, typeof(T));
|
||||
else return default(T);
|
||||
}
|
||||
}
|
||||
}
|
||||
/*生成模型类后需要手动修改的地方。所以尽量少使用rowid\rowversion\blob\time\time with time zone\datetime with time zone 这几种类型
|
||||
*
|
||||
======================================================================================
|
||||
//增加特性配置
|
||||
[SugarColumn(SqlParameterDbType = typeof(DateTimeOffsetConvert))]
|
||||
public TimeSpan? C_TIME { get; set; }
|
||||
|
||||
[SugarColumn(SqlParameterDbType = typeof(DateTimeOffsetConvert))]
|
||||
public TimeSpan C_TIME_WITH_TIME_ZONE { get; set; }
|
||||
|
||||
[SugarColumn(SqlParameterDbType = typeof(DateTimeOffsetConvert))]
|
||||
public DateTimeOffset C_DATETIME_WITH_TIME_ZONE { get; set; }
|
||||
======================================================================================可以使用类型BINARY
|
||||
//增加特性配置,写值可以写byte[]或者XGBlob
|
||||
[SugarColumn(SqlParameterDbType = typeof(CommonPropertyConvert))]
|
||||
public object C_BLOB { get; set; }
|
||||
======================================================================================尽量不使用
|
||||
//上传内容为ANSI编码读取
|
||||
public string C_CLOB { get; set; }
|
||||
//手动修改为类型Version
|
||||
public Version C_ROWVERSION { get; set; }
|
||||
*/
|
||||
@@ -0,0 +1,9 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace SqlSugar.Xugu
|
||||
{
|
||||
public class XuguDbFirst : DbFirstProvider { }
|
||||
}
|
||||
@@ -0,0 +1,334 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Xml.Linq;
|
||||
using static Npgsql.Replication.PgOutput.Messages.RelationMessage;
|
||||
|
||||
namespace SqlSugar.Xugu
|
||||
{
|
||||
public class XuguDbMaintenance : DbMaintenanceProvider
|
||||
{
|
||||
#region DML
|
||||
/// <summary>
|
||||
/// 列出所有数据库名
|
||||
/// </summary>
|
||||
protected override string GetDataBaseSql => "SELECT DB_NAME FROM USER_DATABASES";
|
||||
/// <summary>
|
||||
/// 列出指定表所有的列属性
|
||||
/// </summary>
|
||||
protected override string GetColumnInfosByTableNameSql
|
||||
{
|
||||
get
|
||||
{
|
||||
//重命名的列必须经过处理,否则会找不到(官方DLL的BUG)
|
||||
string sql = @"SELECT C.TABLE_ID+0 `TABLEID`,
|
||||
TRIM(T.TABLE_NAME) `TABLENAME`,
|
||||
TRIM(C.COL_NAME) `DBCOLUMNNAME`,
|
||||
TRIM(C.TYPE_NAME) `DATATYPE`,
|
||||
CASE WHEN C.SCALE>=65536 THEN -1 ELSE C.SCALE END `LENGTH`,
|
||||
TRIM(C.DEF_VAL) `DEFAULTVALUE`,
|
||||
TRIM(C.COMMENTS) `COLUMNDESCRIPTION`,
|
||||
CASE WHEN C.SCALE>=65536 THEN FLOOR(C.SCALE / 65536) ELSE -1 END `SCALE`,
|
||||
CASE WHEN C.SCALE>=65536 THEN C.SCALE - FLOOR(C.SCALE / 65536)*65536 ELSE -1 END `DECIMALDIGITS`,
|
||||
CASE WHEN C.NOT_NULL THEN FALSE ELSE TRUE END `ISNULLABLE`,
|
||||
CASE WHEN C.IS_SERIAL THEN TRUE ELSE FALSE END `ISIDENTITY`,
|
||||
CASE WHEN I.IS_PRIMARY THEN TRUE ELSE FALSE END `ISPRIMARYKEY`
|
||||
FROM USER_COLUMNS C
|
||||
LEFT JOIN USER_TABLES T ON T.TABLE_ID=C.TABLE_ID
|
||||
LEFT JOIN USER_INDEXES I ON T.TABLE_ID=I.TABLE_ID AND I.KEYS LIKE '%""'+C.COL_NAME+'""%'
|
||||
WHERE T.TABLE_NAME='{0}' AND T.DB_ID=CURRENT_DB_ID
|
||||
AND T.USER_ID=CURRENT_USERID AND T.SCHEMA_ID=CURRENT_SCHEMAID
|
||||
ORDER BY C.COL_NO";//FIND_IN_SET('""'+C.COL_NAME+'""',I.KEYS)>0
|
||||
return sql;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取用户所有表名、描述
|
||||
/// </summary>
|
||||
protected override string GetTableInfoListSql=> "SELECT TRIM(TABLE_NAME) name,TRIM(COMMENTS) Description FROM USER_TABLES";
|
||||
/// <summary>
|
||||
/// 获取用户所有视图名、描述
|
||||
/// </summary>
|
||||
protected override string GetViewInfoListSql=> "SELECT TRIM(VIEW_NAME) name,TRIM(COMMENTS) Description FROM USER_VIEWS";
|
||||
#endregion
|
||||
|
||||
#region DDL
|
||||
/// <summary>
|
||||
/// 创建数据库
|
||||
/// </summary>
|
||||
protected override string CreateDataBaseSql => "CREATE DATABASE {0} ";
|
||||
protected override string AddPrimaryKeySql=> "ALTER TABLE {0} ADD CONSTRAINT {1} PRIMARY KEY({2})";
|
||||
protected override string AddColumnToTableSql=> "ALTER TABLE {0} ADD COLUMN {1} {2}{3} @IDENT@{6} @PK@{5} {4}";
|
||||
protected override string AlterColumnToTableSql=> "ALTER TABLE {0} ALTER COLUMN {1} {2}{3} @IDENT@{6} @PK@{5} {4}";
|
||||
/// <summary>
|
||||
/// 备份数据库,文件路径为服务器上相对于XHOME的路径
|
||||
/// </summary>
|
||||
protected override string BackupDataBaseSql => "BACKUP DATABASE TO '{1}'";
|
||||
protected override string CreateTableSql=> "CREATE TABLE {0}(\r\n{1})";
|
||||
protected override string CreateTableColumn=> "{0} {1}{2} {3} {4} {5}";
|
||||
/// <summary>
|
||||
/// 清空表
|
||||
/// </summary>
|
||||
protected override string TruncateTableSql=> "TRUNCATE TABLE {0}";
|
||||
protected override string BackupTableSql=> "SELECT TOP {0} * INTO {1} FROM {2}";
|
||||
protected override string DropTableSql=> "DROP TABLE {0}";
|
||||
protected override string DropColumnToTableSql=> "ALTER TABLE {0} DROP COLUMN {1}";
|
||||
protected override string DropConstraintSql=> "ALTER TABLE {0} DROP CONSTRAINT {1}";
|
||||
protected override string RenameColumnSql => "ALTER TABLE {0} RENAME COLUMN {1} TO {2}";
|
||||
protected override string AddColumnRemarkSql => "COMMENT ON COLUMN {1}.{0} IS '{2}'";
|
||||
|
||||
protected override string DeleteColumnRemarkSql => "COMMENT ON COLUMN {1}.{0} IS ''";
|
||||
|
||||
protected override string IsAnyColumnRemarkSql
|
||||
{
|
||||
get
|
||||
{
|
||||
return @"SELECT T.TABLE_NAME AS table_name,C.COL_NAME AS column_name,C.COMMENTS AS column_description
|
||||
FROM USER_COLUMNS C
|
||||
LEFT JOIN USER_TABLES T ON T.TABLE_ID=C.TABLE_ID
|
||||
WHERE T.TABLE_NAME='{1}' AND C.COL_NAME='{0}' AND T.DB_ID=CURRENT_DB_ID
|
||||
AND T.USER_ID=CURRENT_USERID AND T.SCHEMA_ID=CURRENT_SCHEMAID";
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
protected override string AddTableRemarkSql=> "COMMENT ON TABLE {0} IS '{1}'";
|
||||
|
||||
protected override string DeleteTableRemarkSql=> "COMMENT ON TABLE {0} IS ''";
|
||||
|
||||
protected override string IsAnyTableRemarkSql
|
||||
{
|
||||
get
|
||||
{
|
||||
return @"SELECT TRIM(COMMENTS) class_desc
|
||||
FROM USER_TABLES T
|
||||
WHERE T.TABLE_NAME='{0}' AND T.DB_ID=CURRENT_DB_ID
|
||||
AND T.USER_ID=CURRENT_USERID AND T.SCHEMA_ID=CURRENT_SCHEMAID";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected override string RenameTableSql => "ALTER TABLE {0} RENAME TO {1}";
|
||||
|
||||
protected override string CreateIndexSql=> "CREATE {3} INDEX IX_{0}_{2} ON {0}({1})";//NONCLUSTERED
|
||||
protected override string AddDefaultValueSql=> "ALTER TABLE {0} ALTER COLUMN {1} SET DEFAULT '{2}'";
|
||||
protected override string IsAnyIndexSql => "SELECT COUNT(*) FROM USER_INDEXES WHERE INDEX_NAME='{0}'";
|
||||
#endregion
|
||||
|
||||
#region Check
|
||||
/// <summary>
|
||||
/// 判断是否能够读取系统表user_tables
|
||||
/// </summary>
|
||||
protected override string CheckSystemTablePermissionsSql=> "SELECT TOP 1 * FROM USER_TABLES";
|
||||
#endregion
|
||||
|
||||
#region Scattered
|
||||
protected override string CreateTableNull=> string.Empty;// "NULL";
|
||||
protected override string CreateTableNotNull=> "NOT NULL";
|
||||
protected override string CreateTablePirmaryKey=> " PRIMARY KEY ";
|
||||
protected override string CreateTableIdentity=> " IDENTITY ";//(1,1)
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
//public override List<DbColumnInfo> GetColumnInfosByTableName(string tableName, bool isCache = true)
|
||||
//{
|
||||
// string cacheKey = "DbMaintenanceProvider.GetColumnInfosByTableName." + this.SqlBuilder.GetNoTranslationColumnName(tableName).ToLower();
|
||||
// cacheKey = GetCacheKey(cacheKey);
|
||||
// if (!isCache)
|
||||
// return GetColumnInfosByTableName(tableName);
|
||||
// else
|
||||
// return this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey,
|
||||
// () =>
|
||||
// {
|
||||
// return GetColumnInfosByTableName(tableName);
|
||||
|
||||
// });
|
||||
//}
|
||||
|
||||
private List<DbColumnInfo> GetColumnInfosByTableName(string tableName)
|
||||
{
|
||||
string sql = "select * /* " + Guid.NewGuid() + " */ from " + SqlBuilder.GetTranslationTableName(tableName) + " WHERE 1=2 ";
|
||||
this.Context.Utilities.RemoveCache<List<DbColumnInfo>>("DbMaintenanceProvider.GetFieldComment." + tableName);
|
||||
this.Context.Utilities.RemoveCache<List<string>>("DbMaintenanceProvider.GetPrimaryKeyByTableNames." + this.SqlBuilder.GetNoTranslationColumnName(tableName).ToLower());
|
||||
var oldIsEnableLog = this.Context.Ado.IsEnableLogEvent;
|
||||
this.Context.Ado.IsEnableLogEvent = false;
|
||||
using (var reader = this.Context.Ado.GetDataReader(sql))
|
||||
{
|
||||
this.Context.Ado.IsEnableLogEvent = oldIsEnableLog;
|
||||
List<DbColumnInfo> result = new List<DbColumnInfo>();
|
||||
var schemaTable = reader.GetSchemaTable();
|
||||
int i = 0;
|
||||
foreach (System.Data.DataRow row in schemaTable.Rows)
|
||||
{
|
||||
DbColumnInfo column = new DbColumnInfo()
|
||||
{
|
||||
TableName = tableName,
|
||||
DataType = row["DataType"].ToString().Replace("System.", "").Trim(),
|
||||
IsNullable = (bool)row["AllowDBNull"],
|
||||
IsIdentity = (bool)row["IsAutoIncrement"],
|
||||
// ColumnDescription = GetFieldComment(tableName, row["ColumnName"].ToString()),
|
||||
DbColumnName = row["ColumnName"].ToString(),
|
||||
//DefaultValue = row["defaultValue"].ToString(),
|
||||
IsPrimarykey = i == 0,//no support get pk
|
||||
Length = row["ColumnSize"].ObjToInt(),
|
||||
Scale = row["numericscale"].ObjToInt()
|
||||
};
|
||||
++i;
|
||||
result.Add(column);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
protected override string GetCreateTableSql(string tableName, List<DbColumnInfo> columns)
|
||||
{
|
||||
List<string> columnArray = new List<string>();
|
||||
Check.Exception(columns.IsNullOrEmpty(), "No columns found ");
|
||||
foreach (var item in columns)
|
||||
{
|
||||
string columnName = this.SqlBuilder.GetTranslationTableName(item.DbColumnName);
|
||||
string dataType = item.DataType;
|
||||
string dataSize = GetSize(item);
|
||||
string nullType = item.IsNullable ? this.CreateTableNull : CreateTableNotNull;
|
||||
if (item.IsIdentity && item.IsPrimarykey)
|
||||
{
|
||||
dataSize = "";
|
||||
dataType += this.CreateTableIdentity + this.CreateTablePirmaryKey;
|
||||
}
|
||||
else if (item.IsIdentity)
|
||||
{
|
||||
dataSize = "";
|
||||
dataType += this.CreateTableIdentity;
|
||||
}
|
||||
else if (item.IsPrimarykey)
|
||||
{
|
||||
dataType = (dataType + dataSize + this.CreateTablePirmaryKey);
|
||||
dataSize = "";
|
||||
}
|
||||
//string identity = item.IsIdentity ? this.CreateTableIdentity : null;
|
||||
string addItem = string.Format(this.CreateTableColumn, columnName, dataType, dataSize, nullType, "", "");
|
||||
columnArray.Add(addItem);
|
||||
}
|
||||
string tableString = string.Format(this.CreateTableSql, this.SqlBuilder.GetTranslationTableName(tableName), string.Join(",\r\n", columnArray));
|
||||
return tableString;
|
||||
}
|
||||
|
||||
|
||||
public override bool AddDefaultValue(string tableName, string columnName, string defaultValue)
|
||||
{
|
||||
if (defaultValue == "''")
|
||||
{
|
||||
defaultValue = "";
|
||||
}
|
||||
var template = AddDefaultValueSql;
|
||||
if (defaultValue != null && defaultValue.ToLower() == "SYSDATE")
|
||||
{
|
||||
template = template.Replace("'{2}'", "{2}");
|
||||
}
|
||||
string sql = string.Format(template, tableName, columnName, defaultValue);
|
||||
this.Context.Ado.ExecuteCommand(sql);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///by current connection string
|
||||
/// </summary>
|
||||
/// <param name="databaseDirectory"></param>
|
||||
/// <returns></returns>
|
||||
public override bool CreateDatabase(string databaseName, string databaseDirectory = null)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
public override void AddDefaultValue(EntityInfo entityInfo)
|
||||
{
|
||||
|
||||
}
|
||||
public override bool CreateTable(string tableName, List<DbColumnInfo> columns, bool isCreatePrimaryKey = true)
|
||||
{
|
||||
tableName = this.SqlBuilder.GetTranslationTableName(tableName);
|
||||
foreach (var item in columns)
|
||||
{
|
||||
if (item.DataType == "decimal" && item.DecimalDigits == 0 && item.Length == 0)
|
||||
{
|
||||
item.DecimalDigits = 4;
|
||||
item.Length = 18;
|
||||
}
|
||||
}
|
||||
string sql = GetCreateTableSql(tableName, columns);
|
||||
this.Context.Ado.ExecuteCommand(sql);
|
||||
//if (isCreatePrimaryKey)
|
||||
//{
|
||||
// var pkColumns = columns.Where(it => it.IsPrimarykey).ToList();
|
||||
// if (pkColumns.Count > 1)
|
||||
// {
|
||||
// this.Context.DbMaintenance.AddPrimaryKeys(tableName, pkColumns.Select(it => it.DbColumnName).ToArray());
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// foreach (var item in pkColumns)
|
||||
// {
|
||||
// this.Context.DbMaintenance.AddPrimaryKey(tableName, item.DbColumnName);
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
return true;
|
||||
}
|
||||
//public override List<DbColumnInfo> GetColumnInfosByTableName(string tableName, bool isCache = true)
|
||||
//{
|
||||
// tableName = SqlBuilder.GetNoTranslationColumnName(tableName);
|
||||
// var result= base.GetColumnInfosByTableName(tableName, isCache);
|
||||
// return result;
|
||||
//}
|
||||
public override bool RenameColumn(string tableName, string oldColumnName, string newColumnName)
|
||||
{
|
||||
tableName = this.SqlBuilder.GetTranslationTableName(tableName);
|
||||
oldColumnName = this.SqlBuilder.GetTranslationColumnName(oldColumnName);
|
||||
newColumnName = this.SqlBuilder.GetNoTranslationColumnName(newColumnName);
|
||||
string sql = string.Format(this.RenameColumnSql, tableName, oldColumnName, newColumnName);
|
||||
this.Context.Ado.ExecuteCommand(sql);
|
||||
return true;
|
||||
}
|
||||
protected override string GetAddColumnSql(string tableName, DbColumnInfo columnInfo)
|
||||
{
|
||||
return base.GetAddColumnSql(tableName, columnInfo)
|
||||
.Replace("@IDENT@", columnInfo.IsIdentity?this.CreateTableIdentity:string.Empty)
|
||||
.Replace("@PK@", columnInfo.IsPrimarykey ? this.CreateTablePirmaryKey : string.Empty);
|
||||
}
|
||||
protected override string GetUpdateColumnSql(string tableName, DbColumnInfo columnInfo)
|
||||
{
|
||||
return base.GetUpdateColumnSql(tableName, columnInfo)
|
||||
.Replace("@IDENT@", columnInfo.IsIdentity ? this.CreateTableIdentity : string.Empty)
|
||||
.Replace("@PK@", columnInfo.IsPrimarykey ? this.CreateTablePirmaryKey : string.Empty);
|
||||
}
|
||||
public override bool UpdateColumn(string tableName, DbColumnInfo column)
|
||||
{
|
||||
try
|
||||
{
|
||||
tableName = this.SqlBuilder.GetTranslationTableName(tableName);
|
||||
string sql = GetUpdateColumnSql(tableName, column);
|
||||
Console.WriteLine(sql);
|
||||
this.Context.Ado.ExecuteCommand(sql);
|
||||
return true;
|
||||
}
|
||||
catch {
|
||||
//Console.WriteLine($"修改数据库列{tableName}.{column.DbColumnName}发生异常");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
public override bool AddPrimaryKey(string tableName, string columnName)
|
||||
{
|
||||
try
|
||||
{
|
||||
tableName = this.SqlBuilder.GetTranslationTableName(tableName);
|
||||
columnName = this.SqlBuilder.GetTranslationTableName(columnName);
|
||||
string sql = string.Format(this.AddPrimaryKeySql, tableName, string.Format("PK_{0}_{1}", this.SqlBuilder.GetNoTranslationColumnName(tableName), this.SqlBuilder.GetNoTranslationColumnName(columnName)), columnName);
|
||||
Console.WriteLine(sql);
|
||||
this.Context.Ado.ExecuteCommand(sql);
|
||||
return true;
|
||||
}
|
||||
catch {
|
||||
//Console.WriteLine($"添加主键 PK_{tableName}_{columnName}发生异常");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
using SqlSugar;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Text;
|
||||
|
||||
namespace SqlSugar.Xugu
|
||||
{
|
||||
public class XuguQueryable<T>:QueryableProvider<T>
|
||||
{
|
||||
|
||||
}
|
||||
public class XuguQueryable<T,T2> : QueryableProvider<T,T2>
|
||||
{
|
||||
|
||||
}
|
||||
public class XuguQueryable<T, T2,T3> : QueryableProvider<T, T2,T3>
|
||||
{
|
||||
|
||||
}
|
||||
public class XuguQueryable<T, T2,T3,T4> : QueryableProvider<T, T2,T3,T4>
|
||||
{
|
||||
|
||||
}
|
||||
public class XuguQueryable<T, T2, T3, T4,T5> : QueryableProvider<T, T2, T3, T4,T5>
|
||||
{
|
||||
|
||||
}
|
||||
public class XuguQueryable<T, T2, T3, T4, T5,T6> : QueryableProvider<T, T2, T3, T4, T5,T6>
|
||||
{
|
||||
|
||||
}
|
||||
public class XuguQueryable<T, T2, T3, T4, T5, T6,T7> : QueryableProvider<T, T2, T3, T4, T5, T6,T7>
|
||||
{
|
||||
|
||||
}
|
||||
public class XuguQueryable<T, T2, T3, T4, T5, T6, T7,T8> : QueryableProvider<T, T2, T3, T4, T5, T6, T7,T8>
|
||||
{
|
||||
|
||||
}
|
||||
public class XuguQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9> : QueryableProvider<T, T2, T3, T4, T5, T6, T7, T8, T9>
|
||||
{
|
||||
|
||||
}
|
||||
public class XuguQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10> : QueryableProvider<T, T2, T3, T4, T5, T6, T7, T8, T9, T10>
|
||||
{
|
||||
|
||||
}
|
||||
public class XuguQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> : QueryableProvider<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>
|
||||
{
|
||||
|
||||
}
|
||||
public class XuguQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> : QueryableProvider<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using Microsoft.Data.SqlClient;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SqlSugar.Xugu
|
||||
{
|
||||
public class XuguBlukCopy
|
||||
{
|
||||
internal List<IGrouping<int, DbColumnInfo>> 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<int> 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<DataColumn>().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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
|
||||
namespace SqlSugar.Xugu
|
||||
{
|
||||
public class XuguBuilder : SqlBuilderProvider
|
||||
{
|
||||
public override string SqlParameterKeyWord => ":";
|
||||
public override string SqlTranslationLeft { get; } =string.Empty;
|
||||
public override string SqlTranslationRight { get; } = string.Empty;
|
||||
public override string GetNoTranslationColumnName(string name) => name;
|
||||
public override string SqlDateNow { get; } = "SYSDATE";
|
||||
public override string FullSqlDateNow { get; } = "SELECT SYSDATE FROM DUAL";
|
||||
public override string GetTranslationTableName(string name)
|
||||
{
|
||||
Check.ArgumentNullException(name, string.Format(ErrorMessage.ObjNotExist, "Table Name"));
|
||||
if (!name.Contains("<>f__AnonymousType") && name.IsContainsIn("(", ")") && name != "Dictionary`2") return name;
|
||||
if (Context.MappingTables == null) return name;
|
||||
var context = this.Context;
|
||||
var mappingInfo = context
|
||||
.MappingTables
|
||||
.FirstOrDefault(it => it.EntityName.Equals(name, StringComparison.CurrentCultureIgnoreCase));
|
||||
name = (mappingInfo == null ? name : mappingInfo.DbTableName);
|
||||
if (name.IsContainsIn("(", ")", SqlTranslationLeft)) return name;
|
||||
if (name.Contains(".")) return string.Join(".", name.Split('.').Select(it => SqlTranslationLeft + it + SqlTranslationRight));
|
||||
else return SqlTranslationLeft + name + SqlTranslationRight;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SqlSugar.Xugu
|
||||
{
|
||||
public class XuguDeleteBuilder : DeleteBuilder { }
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
using System;
|
||||
|
||||
namespace SqlSugar.Xugu
|
||||
{
|
||||
public partial class XuguExpressionContext : ExpressionContext, ILambdaExpressions
|
||||
{
|
||||
public override string SqlParameterKeyWord => ":";
|
||||
public SqlSugarProvider Context { get; set; }
|
||||
public XuguExpressionContext() => base.DbMehtods = new XuguMethod();
|
||||
public override string SqlTranslationLeft { get; } = string.Empty;
|
||||
public override string SqlTranslationRight { get; } = string.Empty;
|
||||
public override bool IsTranslationText(string name)=> name.IsContainsIn(UtilConstants.Space, "(", ")");
|
||||
public override string GetLimit() => "";
|
||||
}
|
||||
public partial class XuguMethod : DefaultDbMethod, IDbMethods
|
||||
{
|
||||
public override string ParameterKeyWord { get; set; } = ":";
|
||||
public override string Length(MethodCallExpressionModel model)
|
||||
{
|
||||
var parameter = model.Args[0];
|
||||
return string.Format(" LENGTH({0}) ", parameter.MemberName);
|
||||
}
|
||||
|
||||
public override string IsNull(MethodCallExpressionModel model)
|
||||
{
|
||||
var parameter = model.Args[0];
|
||||
var parameter1 = model.Args[1];
|
||||
return string.Format("NVL({0},{1})", parameter.MemberName, parameter1.MemberName);
|
||||
}
|
||||
|
||||
public override string MergeString(params string[] strings)=> string.Join("||", strings);
|
||||
|
||||
public override string GetRandom()=> " SYS_GUID() ";
|
||||
public override string GetForXmlPath() => null;// " FOR XML PATH('')),1,len(N','),'') ";
|
||||
public override string GetStringJoinSelector(string result, string separator)=> $"REPLACE(WM_CONCAT({result}),',','{separator}')";
|
||||
public override string DateValue(MethodCallExpressionModel model)
|
||||
{
|
||||
var parameter = model.Args[0];
|
||||
var parameter2 = model.Args[1];
|
||||
var type = (DateType)Enum.Parse(typeof(DateType), parameter2.MemberValue.ObjToString(), false);
|
||||
switch (type)
|
||||
{
|
||||
case DateType.Year: return $"GETYEAR({parameter.MemberName})";
|
||||
case DateType.Month: return $"GETMONTH({parameter.MemberName})";
|
||||
case DateType.Day: return $"GETDAY({parameter.MemberName})";
|
||||
case DateType.Hour: return $"GETHOUR({parameter.MemberName})";
|
||||
case DateType.Minute: return $"GETMINUTE({parameter.MemberName})";
|
||||
case DateType.Second: return $"GETSECOND({parameter.MemberName})";
|
||||
case DateType.Weekday: return $"DAYOFWEEK({parameter.MemberName})";
|
||||
case DateType.Quarter: return $"CEIL(GETMONTH({parameter.MemberName})/3)";
|
||||
case DateType.Millisecond:
|
||||
default: return $"DAYOFYEAR({parameter.MemberName})";
|
||||
}
|
||||
}
|
||||
public override string GetDate() => " SYSDATE ";
|
||||
public override string HasValue(MethodCallExpressionModel model)
|
||||
{
|
||||
if (model.Args[0].Type == UtilConstants.GuidType)
|
||||
{
|
||||
var parameter = model.Args[0];
|
||||
return string.Format("( {0} IS NOT NULL )", parameter.MemberName);
|
||||
}
|
||||
else
|
||||
{
|
||||
var parameter = model.Args[0];
|
||||
return string.Format("( {0}<>'' AND {0} IS NOT NULL )", parameter.MemberName);
|
||||
}
|
||||
}
|
||||
public override string CharIndex(MethodCallExpressionModel model)
|
||||
{
|
||||
return string.Format("INSTR ({0},{1},1,1) ", model.Args[0].MemberName, model.Args[1].MemberName);
|
||||
}
|
||||
public override string Contains(MethodCallExpressionModel model)
|
||||
{
|
||||
var parameter = model.Args[0];
|
||||
var parameter2 = model.Args[1];
|
||||
return string.Format(" ({0} like '%'||{1}||'%') ", parameter.MemberName, parameter2.MemberName);
|
||||
}
|
||||
public override string StartsWith(MethodCallExpressionModel model)
|
||||
{
|
||||
var parameter = model.Args[0];
|
||||
var parameter2 = model.Args[1];
|
||||
return string.Format(" ({0} like {1}||'%') ", parameter.MemberName, parameter2.MemberName);
|
||||
}
|
||||
public override string EndsWith(MethodCallExpressionModel model)
|
||||
{
|
||||
var parameter = model.Args[0];
|
||||
var parameter2 = model.Args[1];
|
||||
return string.Format(" ({0} like '%'||{1}) ", parameter.MemberName, parameter2.MemberName);
|
||||
}
|
||||
public override string ToString(MethodCallExpressionModel model)
|
||||
{
|
||||
var parameter = model.Args[0];
|
||||
return string.Format(" CAST({0} AS NVARCHAR)", parameter.MemberName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
using Microsoft.Data.SqlClient;
|
||||
using System;
|
||||
using System.Data;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SqlSugar.Xugu
|
||||
{
|
||||
|
||||
public class XuguFastBuilder: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)
|
||||
{
|
||||
|
||||
SqlBulkCopy bulkCopy = GetBulkCopyInstance();
|
||||
bulkCopy.DestinationTableName = dt.TableName;
|
||||
try
|
||||
{
|
||||
await bulkCopy.WriteToServerAsync(dt);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
CloseDb();
|
||||
throw ex;
|
||||
}
|
||||
CloseDb();
|
||||
return dt.Rows.Count;
|
||||
}
|
||||
public 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SqlSugar.Xugu
|
||||
{
|
||||
public class XuguInsertBuilder : InsertBuilder
|
||||
{
|
||||
public override string SqlTemplateBatch { get; } = "INSERT into {0} ({1})";
|
||||
public override string SqlTemplate
|
||||
{
|
||||
get
|
||||
{
|
||||
if (IsReturnIdentity)
|
||||
{
|
||||
return @"INSERT INTO {0}
|
||||
({1})
|
||||
VALUES
|
||||
({2}) RETURNING $PrimaryKey未实现返回主键 " + UtilConstants.ReplaceCommaKey.Replace("{", "").Replace("}", "");
|
||||
}
|
||||
else
|
||||
{
|
||||
return @"INSERT INTO {0}
|
||||
({1})
|
||||
VALUES
|
||||
({2}) " + UtilConstants.ReplaceCommaKey.Replace("{", "").Replace("}", "");
|
||||
}
|
||||
}
|
||||
}
|
||||
public override string GetTableNameString
|
||||
{
|
||||
get
|
||||
{
|
||||
var result = Builder.GetTranslationTableName(EntityInfo.EntityName);
|
||||
result += UtilConstants.Space;
|
||||
if (this.TableWithString.HasValue()) result += TableWithString + UtilConstants.Space;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
public override string ToSqlString()
|
||||
{
|
||||
if (IsNoInsertNull) DbColumnInfoList = DbColumnInfoList.Where(it => it.Value != null).ToList();
|
||||
var groupList = DbColumnInfoList.GroupBy(it => it.TableId).ToList();
|
||||
var isSingle = groupList.Count() == 1;
|
||||
string columnsString = string.Join(",", groupList.First().Select(it => Builder.GetTranslationColumnName(it.DbColumnName)));
|
||||
if (isSingle)
|
||||
{
|
||||
string columnParametersString = string.Join(",", this.DbColumnInfoList.Select(it => base.GetDbColumn(it, Builder.SqlParameterKeyWord + it.DbColumnName)));
|
||||
return string.Format(SqlTemplate, GetTableNameString, columnsString, columnParametersString);
|
||||
}
|
||||
else
|
||||
{
|
||||
StringBuilder batchInsetrSql = new StringBuilder();
|
||||
int pageSize = groupList.Count;
|
||||
int pageIndex = 1;
|
||||
int totalRecord = groupList.Count;
|
||||
int pageCount = (totalRecord + pageSize - 1) / pageSize;
|
||||
while (pageCount >= pageIndex)
|
||||
{
|
||||
batchInsetrSql.AppendFormat(SqlTemplateBatch, GetTableNameString, columnsString);
|
||||
batchInsetrSql.AppendFormat("SELECT * FROM (");
|
||||
int i = 0;
|
||||
foreach (var columns in groupList.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList())
|
||||
{
|
||||
var isFirst = i == 0;
|
||||
if (!isFirst) batchInsetrSql.Append(SqlTemplateBatchUnion);
|
||||
batchInsetrSql.Append("\r\n SELECT " + string.Join(",", columns.Select(it => string.Format(SqlTemplateBatchSelect, base.GetDbColumn(it, FormatValue(it.Value)), Builder.GetTranslationColumnName(it.DbColumnName)))) + " from dual");
|
||||
++i;
|
||||
}
|
||||
pageIndex++;
|
||||
batchInsetrSql.Append(") temp1\r\n;\r\n");
|
||||
}
|
||||
return batchInsetrSql.ToString();// + " GETID ";
|
||||
}
|
||||
}
|
||||
public override object FormatValue(object value)
|
||||
{
|
||||
var n = "";
|
||||
if (value == null) return "NULL";
|
||||
var type = UtilMethods.GetUnderType(value.GetType());
|
||||
if (type == UtilConstants.DateType) return GetDateTimeString(value);
|
||||
else if (value is DateTimeOffset) return GetDateTimeOffsetString(value);
|
||||
else if (type == UtilConstants.ByteArrayType)
|
||||
{
|
||||
string bytesString = "0x" + BitConverter.ToString((byte[])value).Replace("-", "");
|
||||
return bytesString;
|
||||
}
|
||||
else if (type.IsEnum())
|
||||
{
|
||||
if (this.Context.CurrentConnectionConfig.MoreSettings?.TableEnumIsString == true) return value.ToSqlValue();
|
||||
else return Convert.ToInt64(value);
|
||||
}
|
||||
else if (type == UtilConstants.BoolType) return value.ObjToBool() ? "1" : "0";
|
||||
else return n + "'" + value + "'";
|
||||
}
|
||||
private object GetDateTimeOffsetString(object value)
|
||||
{
|
||||
var date = UtilMethods.ConvertFromDateTimeOffset((DateTimeOffset)value);
|
||||
if (date < UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig))
|
||||
date = UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig);
|
||||
return "'" + date.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'";
|
||||
}
|
||||
|
||||
private object GetDateTimeString(object value)
|
||||
{
|
||||
var date = value.ObjToDate();
|
||||
if (date < UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig))
|
||||
date = UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig);
|
||||
return "'" + date.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'";
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SqlSugar.Xugu
|
||||
{
|
||||
public class XuguQueryBuilder: QueryBuilder
|
||||
{
|
||||
#region Sql Template
|
||||
/* SELECT * FROM TABLE WHERE CONDITION ORDER BY ID DESC LIMIT 0,10 */
|
||||
public override string PageTempalte { get; }= "SELECT {0} FROM {1} {2} {3} {4} LIMIT {5},{6}";
|
||||
public override string DefaultOrderByTemplate { get; } = "ORDER BY SYSDATE ";
|
||||
#endregion
|
||||
|
||||
#region Common Methods
|
||||
public override bool IsComplexModel(string sql)=> Regex.IsMatch(sql, @"AS \`\w+\.\w+\`") || Regex.IsMatch(sql, @"AS \`\w+\.\w+\.\w+\`");
|
||||
public override string ToSqlString()
|
||||
{
|
||||
base.AppendFilter();
|
||||
string oldOrderValue = this.OrderByValue;
|
||||
string result = null;
|
||||
sql = new StringBuilder();
|
||||
sql.AppendFormat(SqlTemplate, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, (Skip != null || Take != null) ? null : GetOrderByString);
|
||||
if (IsCount) { return sql.ToString(); }
|
||||
if (Skip != null && Take == null)
|
||||
{
|
||||
if (this.OrderByValue == "ORDER BY ") this.OrderByValue += GetSelectValue.Split(',')[0];
|
||||
result = string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, (Skip != null || Take != null) ? null : GetOrderByString, Skip.ObjToInt(), long.MaxValue);
|
||||
}
|
||||
else if (Skip == null && Take != null)
|
||||
{
|
||||
if (this.OrderByValue == "ORDER BY ") this.OrderByValue += GetSelectValue.Split(',')[0];
|
||||
result = string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, GetOrderByString, 0, Take.ObjToInt());
|
||||
}
|
||||
else if (Skip != null && Take != null)
|
||||
{
|
||||
if (Skip == 0 && Take == 1 && this.OrderByValue == "ORDER BY SYSDATE ") this.OrderByValue = null;
|
||||
if (this.OrderByValue == "ORDER BY ") this.OrderByValue += GetSelectValue.Split(',')[0];
|
||||
result = string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, GetOrderByString, Skip.ObjToInt() > 0 ? Skip.ObjToInt() : 0, Take);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = sql.ToString();
|
||||
}
|
||||
this.OrderByValue = oldOrderValue;
|
||||
result = GetSqlQuerySql(result);
|
||||
if (result.IndexOf("-- No table") > 0) return "-- No table";
|
||||
if (TranLock != null) result = result + TranLock;
|
||||
return result;
|
||||
}
|
||||
private string ToCountSqlString()
|
||||
{
|
||||
//base.AppendFilter();
|
||||
string oldOrderValue = this.OrderByValue;
|
||||
string result = null;
|
||||
sql = new StringBuilder();
|
||||
sql.AppendFormat(SqlTemplate, "COUNT(*)", GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, (Skip != null || Take != null) ? null : GetOrderByString);
|
||||
if (IsCount)
|
||||
{
|
||||
if (sql.ToString().Contains("-- No table")) return "-- No table";
|
||||
return sql.ToString();
|
||||
}
|
||||
if (Skip != null && Take == null)
|
||||
{
|
||||
if (this.OrderByValue == "ORDER BY ") this.OrderByValue += GetSelectValue.Split(',')[0];
|
||||
result = string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, (Skip != null || Take != null) ? null : GetOrderByString, Skip.ObjToInt(), long.MaxValue);
|
||||
}
|
||||
else if (Skip == null && Take != null)
|
||||
{
|
||||
if (this.OrderByValue == "ORDER BY ") this.OrderByValue += GetSelectValue.Split(',')[0];
|
||||
result = string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, GetOrderByString, 0, Take.ObjToInt());
|
||||
}
|
||||
else if (Skip != null && Take != null)
|
||||
{
|
||||
if (this.OrderByValue == "ORDER BY ") this.OrderByValue += GetSelectValue.Split(',')[0];
|
||||
result = string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, GetOrderByString, Skip.ObjToInt() > 0 ? Skip.ObjToInt() : 0, Take);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = sql.ToString();
|
||||
}
|
||||
this.OrderByValue = oldOrderValue;
|
||||
return result;
|
||||
}
|
||||
public override string ToCountSql(string sql)
|
||||
{
|
||||
if (this.GroupByValue.HasValue() || this.IsDistinct) return base.ToCountSql(sql);
|
||||
else return ToCountSqlString();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Get SQL Partial
|
||||
public override string GetSelectValue
|
||||
{
|
||||
get
|
||||
{
|
||||
string result = string.Empty;
|
||||
if (this.SelectValue == null || this.SelectValue is string) result = GetSelectValueByString();
|
||||
else result = GetSelectValueByExpression();
|
||||
if (this.SelectType == ResolveExpressType.SelectMultiple)
|
||||
this.SelectCacheKey = this.SelectCacheKey + string.Join("-", this.JoinQueryInfos.Select(it => it.TableName));
|
||||
if (IsDistinct) result = " DISTINCT " + result;
|
||||
if (this.SubToListParameters != null && this.SubToListParameters.Any()) result = SubToListMethod(result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SqlSugar.Xugu
|
||||
{
|
||||
public class XuguUpdateBuilder : UpdateBuilder
|
||||
{
|
||||
protected override string TomultipleSqlString(List<IGrouping<int, DbColumnInfo>> groupList)
|
||||
{
|
||||
if (groupList == null || groupList.Count == 0) return "SELECT 0 FROM DUAL";
|
||||
StringBuilder sb = new StringBuilder();
|
||||
int i = 0;
|
||||
sb.AppendLine(string.Join(UtilConstants.ReplaceCommaKey.Replace("{", "").Replace("}", ""), groupList.Select(t =>
|
||||
{
|
||||
var updateTable = string.Format("UPDATE {0} SET ", base.GetTableNameStringNoWith);
|
||||
var setValues = string.Join(",", t.Where(s => !s.IsPrimarykey).Select(m => GetOracleUpdateColums(i, m, false)).ToArray());
|
||||
var pkList = t.Where(s => s.IsPrimarykey).ToList();
|
||||
List<string> whereList = new List<string>();
|
||||
foreach (var item in pkList)
|
||||
{
|
||||
var isFirst = pkList.First() == item;
|
||||
var whereString = "";
|
||||
whereString += GetOracleUpdateColums(i, item, true);
|
||||
whereList.Add(whereString);
|
||||
}
|
||||
i++;
|
||||
return string.Format("{0} {1} WHERE {2} ", updateTable, setValues, string.Join(" AND", whereList));
|
||||
}).ToArray()));
|
||||
return sb.ToString();
|
||||
}
|
||||
private object GetValue(DbColumnInfo it)=> FormatValue(it.Value);
|
||||
private string GetOracleUpdateColums(int i, DbColumnInfo m, bool iswhere)=> string.Format("{0}={1}", m.DbColumnName, base.GetDbColumn(m, FormatValue(i, m.DbColumnName, m.Value, iswhere)));
|
||||
public object FormatValue(int i, string name, object value, bool iswhere)
|
||||
{
|
||||
if (value == null) return "NULL";
|
||||
else
|
||||
{
|
||||
var type = UtilMethods.GetUnderType(value.GetType());
|
||||
if (type == UtilConstants.DateType && iswhere == false)
|
||||
{
|
||||
var date = value.ObjToDate();
|
||||
if (date < UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig))
|
||||
date = UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig);
|
||||
|
||||
if (this.Context.CurrentConnectionConfig?.MoreSettings?.DisableMillisecond == true)
|
||||
return "'" + date.ToString("yyyy-MM-dd HH:mm:ss") + "'";
|
||||
else
|
||||
return "'" + date.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'";
|
||||
}
|
||||
else if (type == UtilConstants.DateType && iswhere)
|
||||
{
|
||||
var parameterName = this.Builder.SqlParameterKeyWord + name + i;
|
||||
this.Parameters.Add(new SugarParameter(parameterName, value));
|
||||
return parameterName;
|
||||
}
|
||||
else if (type.IsEnum())
|
||||
{
|
||||
if (this.Context.CurrentConnectionConfig.MoreSettings?.TableEnumIsString == true) return value.ToSqlValue();
|
||||
else return Convert.ToInt64(value);
|
||||
}
|
||||
else if (type == UtilConstants.ByteArrayType)
|
||||
{
|
||||
var parameterName = this.Builder.SqlParameterKeyWord + name + i;
|
||||
this.Parameters.Add(new SugarParameter(parameterName, value));
|
||||
return parameterName;
|
||||
}
|
||||
else if (value is int || value is long || value is short || value is short || value is byte) return value;
|
||||
else if (value is bool) return value.ObjToString().ToLower();
|
||||
else if (type == UtilConstants.StringType || type == UtilConstants.ObjType) return "'" + value.ToString().ToSqlFilter() + "'";
|
||||
else return "'" + value.ToString() + "'";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
34
Src/Asp.NetCore2/SqlSugar.XuguCore/Xugu/XuguEntry.cs
Normal file
34
Src/Asp.NetCore2/SqlSugar.XuguCore/Xugu/XuguEntry.cs
Normal file
@@ -0,0 +1,34 @@
|
||||
namespace SqlSugar.Xugu
|
||||
{
|
||||
/// <summary>
|
||||
/// 入口点
|
||||
/// </summary>
|
||||
public static class XuguEntry
|
||||
{
|
||||
/// <summary>
|
||||
/// 使用虚谷数据库,并进行配置。
|
||||
/// <code>
|
||||
/// 引用包 SqlSugar.XuguCore
|
||||
/// using SqlSugar.Xugu;
|
||||
///
|
||||
/// protected static SqlSugarScope db = new SqlSugarScope(new ConnectionConfig()
|
||||
/// {
|
||||
/// ConnectionString = "IP=127.0.0.1;DB=SYSTEM;User=SYSDBA;PWD=SYSDBA;Port=5138;AUTO_COMMIT=on;CHAR_SET=GBK",
|
||||
/// DbType = DbType.Custom.UseXugu(),
|
||||
/// IsAutoCloseConnection = true,
|
||||
/// });
|
||||
/// 不需要对 InstanceFactory.CustomDbName 等进行配置,已经配置好了
|
||||
/// 仅实现了简单的增删改查,未实现函数,未实现返回插入主键等高级用法
|
||||
/// </code>
|
||||
/// </summary>
|
||||
/// <param name="type">任意数据库类型,建议Custom</param>
|
||||
/// <returns>DbType.Custom</returns>
|
||||
public static DbType UseXugu(this DbType type)
|
||||
{
|
||||
InstanceFactory.CustomDbName = "Xugu";//文件名前缀
|
||||
InstanceFactory.CustomDllName = "SqlSugar.XuguCore";//扩展的dll名字
|
||||
InstanceFactory.CustomNamespace = "SqlSugar.Xugu";//扩展dll的命名空间
|
||||
return DbType.Custom;
|
||||
}
|
||||
}
|
||||
}
|
||||
283
Src/Asp.NetCore2/SqlSugar.XuguCore/Xugu/XuguProvider.cs
Normal file
283
Src/Asp.NetCore2/SqlSugar.XuguCore/Xugu/XuguProvider.cs
Normal file
@@ -0,0 +1,283 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Data.Common;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using XuguClient;
|
||||
|
||||
namespace SqlSugar.Xugu
|
||||
{
|
||||
/// <summary>
|
||||
/// 虚谷 ADO 提供器
|
||||
/// </summary>
|
||||
public class XuguProvider : AdoProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// 构造函数
|
||||
/// </summary>
|
||||
public XuguProvider() { }
|
||||
/// <summary>
|
||||
/// 数据库连接对象
|
||||
/// </summary>
|
||||
public override IDbConnection Connection
|
||||
{
|
||||
get
|
||||
{
|
||||
if (base._DbConnection == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
base._DbConnection = new XGConnection(base.Context.CurrentConnectionConfig.ConnectionString);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
return base._DbConnection;
|
||||
}
|
||||
set
|
||||
{
|
||||
base._DbConnection = value;
|
||||
}
|
||||
}
|
||||
public override string SqlParameterKeyWord => ":";
|
||||
public string SplitCommandTag => UtilConstants.ReplaceCommaKey.Replace("{", "").Replace("}", "");
|
||||
public override object GetScalar(string sql, params SugarParameter[] parameters)
|
||||
{
|
||||
if (this.Context.Ado.Transaction != null) return _GetScalar(sql, parameters);
|
||||
try
|
||||
{
|
||||
this.Context.Ado.BeginTran();
|
||||
var result = _GetScalar(sql, parameters);
|
||||
this.Context.Ado.CommitTran();
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
this.Context.Ado.RollbackTran();
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
public override async Task<object> GetScalarAsync(string sql, params SugarParameter[] parameters)
|
||||
{
|
||||
if (this.Context.Ado.Transaction != null) return await _GetScalarAsync(sql, parameters);
|
||||
try
|
||||
{
|
||||
this.Context.Ado.BeginTran();
|
||||
var result = await _GetScalarAsync(sql, parameters);
|
||||
this.Context.Ado.CommitTran();
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
this.Context.Ado.RollbackTran();
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
private void CheckSqlNull(string sql) { if (string.IsNullOrWhiteSpace(sql)) throw new ArgumentNullException("sql", "SQL语句不能为空"); }
|
||||
private object _GetScalar(string sql, SugarParameter[] parameters)
|
||||
{
|
||||
CheckSqlNull(sql);
|
||||
if (sql.IndexOf(this.SplitCommandTag) > 0)
|
||||
{
|
||||
var sqlParts = Regex.Split(sql, this.SplitCommandTag).Where(it => !string.IsNullOrEmpty(it)).ToList();
|
||||
object result = 0;
|
||||
foreach (var item in sqlParts)
|
||||
{
|
||||
if (item.TrimStart('\r').TrimStart('\n') != "") result = base.GetScalar(item, parameters);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
else return base.GetScalar(sql, parameters);
|
||||
}
|
||||
private async Task<object> _GetScalarAsync(string sql, SugarParameter[] parameters)
|
||||
{
|
||||
CheckSqlNull(sql);
|
||||
if (sql.IndexOf(this.SplitCommandTag) > 0)
|
||||
{
|
||||
var sqlParts = Regex.Split(sql, this.SplitCommandTag).Where(it => !string.IsNullOrEmpty(it)).ToList();
|
||||
object result = 0;
|
||||
foreach (var item in sqlParts)
|
||||
{
|
||||
if (item.TrimStart('\r').TrimStart('\n') != "") result = await base.GetScalarAsync(item, parameters);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
else return await base.GetScalarAsync(sql, parameters);
|
||||
}
|
||||
|
||||
public override int ExecuteCommand(string sql, SugarParameter[] parameters)
|
||||
{
|
||||
CheckSqlNull(sql);
|
||||
if (sql.IndexOf(this.SplitCommandTag) > 0)
|
||||
{
|
||||
var sqlParts = Regex.Split(sql, this.SplitCommandTag).Where(it => !string.IsNullOrEmpty(it)).ToList();
|
||||
int result = 0;
|
||||
foreach (var item in sqlParts)
|
||||
{
|
||||
if (item.TrimStart('\r').TrimStart('\n') != "") result += base.ExecuteCommand(item, parameters);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
else return base.ExecuteCommand(sql, parameters);
|
||||
}
|
||||
public override async Task<int> ExecuteCommandAsync(string sql, SugarParameter[] parameters)
|
||||
{
|
||||
CheckSqlNull(sql);
|
||||
if (sql.IndexOf(this.SplitCommandTag) > 0)
|
||||
{
|
||||
var sqlParts = Regex.Split(sql, this.SplitCommandTag).Where(it => !string.IsNullOrEmpty(it)).ToList();
|
||||
int result = 0;
|
||||
foreach (var item in sqlParts)
|
||||
{
|
||||
if (item.TrimStart('\r').TrimStart('\n') != "") result += await base.ExecuteCommandAsync(item, parameters);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
else return await base.ExecuteCommandAsync(sql, parameters);
|
||||
}
|
||||
|
||||
public override void BeginTran(string transactionName)
|
||||
{
|
||||
CheckConnection();
|
||||
base.Transaction = ((XGConnection)this.Connection).BeginTransaction();
|
||||
}
|
||||
|
||||
public override void BeginTran(IsolationLevel iso, string transactionName)
|
||||
{
|
||||
CheckConnection();
|
||||
base.Transaction = ((XGConnection)this.Connection).BeginTransaction(iso);
|
||||
}
|
||||
|
||||
public override IDataAdapter GetAdapter()=> new XuguDataAdapter();
|
||||
public override DbCommand GetCommand(string sql, SugarParameter[] parameters)
|
||||
{
|
||||
CheckSqlNull(sql);
|
||||
var helper = new XuguInsertBuilder();
|
||||
helper.Context = this.Context;
|
||||
//if (parameters != null)
|
||||
//{
|
||||
// foreach (var param in parameters.OrderByDescending(it => it.ParameterName.Length))
|
||||
// {
|
||||
// sql = sql.Replace(param.ParameterName, "?");//helper.FormatValue(param.Value)
|
||||
// }
|
||||
//}
|
||||
XGCommand sqlCommand = new XGCommand(sql, (XGConnection)this.Connection);
|
||||
sqlCommand.CommandType = this.CommandType;
|
||||
if (parameters != null && parameters.Length > 0) sqlCommand.Parameters.AddRange(GetSqlParameter(parameters));
|
||||
sqlCommand.CommandTimeout = this.CommandTimeOut;
|
||||
if (this.Transaction != null) sqlCommand.Transaction = (XGTransaction)this.Transaction;
|
||||
//if (parameters.HasValue())
|
||||
//{
|
||||
// OdbcParameter[] ipars = GetSqlParameter(parameters);
|
||||
// sqlCommand.Parameters.AddRange(ipars);
|
||||
//}
|
||||
CheckConnection();
|
||||
return sqlCommand;
|
||||
}
|
||||
public override void SetCommandToAdapter(IDataAdapter dataAdapter, DbCommand command)=> ((XuguDataAdapter)dataAdapter).SelectCommand = (XGCommand)command;
|
||||
public override IDataParameter[] ToIDbDataParameter(params SugarParameter[] parameters)=> GetSqlParameter(parameters);
|
||||
private int bufferSize = 1024000;
|
||||
public XGParameters[] GetSqlParameter(params SugarParameter[] parameters)
|
||||
{
|
||||
if (parameters == null || parameters.Length == 0) return null;
|
||||
XGParameters[] result = new XGParameters[parameters.Length];
|
||||
int index = 0;
|
||||
foreach (var parameter in parameters)
|
||||
{
|
||||
if (parameter.Value == null) parameter.Value = DBNull.Value;
|
||||
var sqlParameter = new XGParameters();
|
||||
sqlParameter.ParameterName = parameter.ParameterName.Trim(this.SqlParameterKeyWord.ToCharArray());
|
||||
sqlParameter.Size = parameter.Size;
|
||||
sqlParameter.Value = parameter.Value;
|
||||
sqlParameter.DbType = GetDbType(parameter);
|
||||
if (parameter.DbType == System.Data.DbType.Time)
|
||||
{
|
||||
sqlParameter.Value = DateTime.Parse(parameter.Value?.ToString()).TimeOfDay;
|
||||
}
|
||||
if (parameter.Value is byte[] binary)
|
||||
{
|
||||
sqlParameter = new XGParameters(sqlParameter.ParameterName, XGDbType.Binary);
|
||||
sqlParameter.Value = binary;
|
||||
|
||||
int num = binary.Length / bufferSize;
|
||||
int mod = binary.Length % bufferSize;
|
||||
if (parameter.DbType == System.Data.DbType.AnsiString)//大概是 BLOB
|
||||
{
|
||||
sqlParameter = new XGParameters(sqlParameter.ParameterName, XGDbType.LongVarBinary);
|
||||
var blob_obj = new XGBlob();
|
||||
blob_obj.BeginChunkWrite();
|
||||
for (int i = 0; i < num + (mod > 0 ? 1 : 0); i++) blob_obj.write(binary, i * bufferSize, i == num ? mod : bufferSize);
|
||||
blob_obj.EndChunkWrite();
|
||||
sqlParameter.Value = blob_obj;
|
||||
}
|
||||
//这个基本没什么用。
|
||||
if (parameter.DbType == System.Data.DbType.String)//大概是 CLOB
|
||||
{
|
||||
sqlParameter = new XGParameters(sqlParameter.ParameterName, XGDbType.LongVarChar);
|
||||
var clob_obj = new XGClob();
|
||||
clob_obj.BeginChunkWrite();
|
||||
for (int i = 0; i < num + (mod > 0 ? 1 : 0); i++) clob_obj.write(binary, i * bufferSize, i == num ? mod : bufferSize);
|
||||
clob_obj.EndChunkWrite();
|
||||
sqlParameter.Value = clob_obj;
|
||||
}
|
||||
}
|
||||
if (parameter.Value is XGClob clob)
|
||||
{
|
||||
sqlParameter = new XGParameters(sqlParameter.ParameterName, XGDbType.LongVarChar);
|
||||
sqlParameter.Value = clob.Length == 0 ? null : parameter.Value;
|
||||
}
|
||||
if (parameter.Value is XGBlob blob)
|
||||
{
|
||||
sqlParameter = new XGParameters(sqlParameter.ParameterName, XGDbType.LongVarBinary);
|
||||
sqlParameter.Value = blob.Length == 0 ? null : parameter.Value;
|
||||
}
|
||||
if (parameter.Value is TimeSpan)
|
||||
{
|
||||
sqlParameter.DbType = System.Data.DbType.String;
|
||||
sqlParameter.Value = parameter.Value?.ToString();
|
||||
}
|
||||
if (parameter.Value != null && parameter.Value != DBNull.Value && parameter.DbType == System.Data.DbType.DateTime)
|
||||
{
|
||||
var date = Convert.ToDateTime(parameter.Value);
|
||||
if (date == DateTime.MinValue)
|
||||
{
|
||||
sqlParameter.Value = UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig);
|
||||
}
|
||||
}
|
||||
if (parameter.Value is DateTimeOffset dateTime)
|
||||
{
|
||||
//sqlParameter.DbType = System.Data.DbType.DateTime;
|
||||
//sqlParameter.Value = UtilMethods.ConvertFromDateTimeOffset(dateTime);
|
||||
sqlParameter.DbType = System.Data.DbType.String;
|
||||
sqlParameter.Value = dateTime.ToString("yyyy-MM-dd HH:mm:ss.fff zzz");
|
||||
}
|
||||
if (parameter.Direction == 0)
|
||||
{
|
||||
parameter.Direction = ParameterDirection.Input;
|
||||
}
|
||||
sqlParameter.Direction = parameter.Direction;
|
||||
result[index] = sqlParameter;
|
||||
if (sqlParameter.Direction.IsIn(ParameterDirection.Output, ParameterDirection.InputOutput, ParameterDirection.ReturnValue))
|
||||
{
|
||||
this.OutputParameters ??= new List<IDataParameter>();
|
||||
this.OutputParameters.RemoveAll(it => it.ParameterName == sqlParameter.ParameterName);
|
||||
this.OutputParameters.Add(sqlParameter);
|
||||
}
|
||||
|
||||
++index;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
private static System.Data.DbType GetDbType(SugarParameter parameter)
|
||||
{
|
||||
if (parameter.DbType == System.Data.DbType.UInt16) return System.Data.DbType.Int16;
|
||||
else if (parameter.DbType == System.Data.DbType.UInt32) return System.Data.DbType.Int32;
|
||||
else if (parameter.DbType == System.Data.DbType.UInt64) return System.Data.DbType.Int64;
|
||||
else return parameter.DbType;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user