From 17ec5dba52f4d0f3aa713fc83eb395cb818e3e0d Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 27 Aug 2022 17:49:11 +0800 Subject: [PATCH] Update Gbase --- Src/Asp.NetCore2/GbaseTest/Config.cs | 6 +- .../GbaseTest/Demo/Demo0_SqlSugarClient.cs | 1 + .../GBase/CodeFirst/GBaseCodeFirst.cs | 5 +- .../GBase/DbMaintenance/GBaseDbMaintenance.cs | 4 + .../SqlSugar.GBaseCore/GBase/GBaseProvider.cs | 112 +++++++++++++++++- .../GBase/SqlBuilder/GBaseBuilder.cs | 30 +++++ .../GBase/SqlBuilder/GBaseInsertBuilder.cs | 108 ++++++++++++++++- 7 files changed, 251 insertions(+), 15 deletions(-) diff --git a/Src/Asp.NetCore2/GbaseTest/Config.cs b/Src/Asp.NetCore2/GbaseTest/Config.cs index 63863c796..dc3a9dfee 100644 --- a/Src/Asp.NetCore2/GbaseTest/Config.cs +++ b/Src/Asp.NetCore2/GbaseTest/Config.cs @@ -16,16 +16,16 @@ namespace OrmTest /// Account have permission to create database /// 用有建库权限的数据库账号 /// - public static string ConnectionString = "Driver={GBase ODBC DRIVER (64-Bit)};Host=localhost;Service=19088;Server=gbase01;Database=testdb1;Protocol=onsoctcp;Uid=gbasedbt;Pwd=GBase123;Db_locale=zh_CN.utf8;Client_locale=zh_CN.utf8"; + public static string ConnectionString = "Driver={GBase ODBC DRIVER (64-Bit)};Host=localhost;Service=19088;Server=gbase01;Database=testdb;Protocol=onsoctcp;Uid=gbasedbt;Pwd=GBase123;Db_locale=zh_CN.utf8;Client_locale=zh_CN.utf8"; /// /// Account have permission to create database /// 用有建库权限的数据库账号 /// - public static string ConnectionString2 = "Driver={GBase ODBC DRIVER (64-Bit)};Host=localhost;Service=19088;Server=gbase01;Database=testdb2;Protocol=onsoctcp;Uid=gbasedbt;Pwd=GBase123;Db_locale=zh_CN.utf8;Client_locale=zh_CN.utf8"; + public static string ConnectionString2 = "Driver={GBase ODBC DRIVER (64-Bit)};Host=localhost;Service=19088;Server=gbase01;Database=testdb;Protocol=onsoctcp;Uid=gbasedbt;Pwd=GBase123;Db_locale=zh_CN.utf8;Client_locale=zh_CN.utf8"; /// /// Account have permission to create database /// 用有建库权限的数据库账号 /// - public static string ConnectionString3 = "Driver={GBase ODBC DRIVER (64-Bit)};Host=localhost;Service=19088;Server=gbase01;Database=testdb3;Protocol=onsoctcp;Uid=gbasedbt;Pwd=GBase123;Db_locale=zh_CN.utf8;Client_locale=zh_CN.utf8"; + public static string ConnectionString3 = "Driver={GBase ODBC DRIVER (64-Bit)};Host=localhost;Service=19088;Server=gbase01;Database=testdb;Protocol=onsoctcp;Uid=gbasedbt;Pwd=GBase123;Db_locale=zh_CN.utf8;Client_locale=zh_CN.utf8"; } } diff --git a/Src/Asp.NetCore2/GbaseTest/Demo/Demo0_SqlSugarClient.cs b/Src/Asp.NetCore2/GbaseTest/Demo/Demo0_SqlSugarClient.cs index e5200ed5f..d0f198f49 100644 --- a/Src/Asp.NetCore2/GbaseTest/Demo/Demo0_SqlSugarClient.cs +++ b/Src/Asp.NetCore2/GbaseTest/Demo/Demo0_SqlSugarClient.cs @@ -79,6 +79,7 @@ from systables a left join syscomments b on b.tabname = a.tabname where a.tabtype in ('T', 'V') and not (a.tabname like 'sys%') AND a.tabname <>'dual'"); + //Create tables db.CodeFirst.InitTables(typeof(OrderItem),typeof(Order)); var id = db.Insertable(new Order() { Name = "order1", CustomId = 1, Price = 0, CreateTime = DateTime.Now }).ExecuteReturnIdentity(); diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/CodeFirst/GBaseCodeFirst.cs b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/CodeFirst/GBaseCodeFirst.cs index c932243da..ff81d9a5f 100644 --- a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/CodeFirst/GBaseCodeFirst.cs +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/CodeFirst/GBaseCodeFirst.cs @@ -6,9 +6,10 @@ namespace SqlSugar.GBase { public class GBaseCodeFirst:CodeFirstProvider { - protected override void ExistLogicEnd(List dbColumns) + public virtual bool IsNoTran { get; set; } = true; + public override void ExistLogic(EntityInfo entityInfo) { - + this.Context.Ado.ExecuteCommand("select '不支持修改表' from dual "); } protected override string GetTableName(EntityInfo entityInfo) { diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/DbMaintenance/GBaseDbMaintenance.cs b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/DbMaintenance/GBaseDbMaintenance.cs index 0b787ae13..c3d429c22 100644 --- a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/DbMaintenance/GBaseDbMaintenance.cs +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/DbMaintenance/GBaseDbMaintenance.cs @@ -377,6 +377,10 @@ where a.tabtype in ('V') and not (a.tabname like 'sys%') AND a.tabname <>'dual' 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 columns, bool isCreatePrimaryKey = true) { diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/GBaseProvider.cs b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/GBaseProvider.cs index 1b95f9e7c..75b881bc3 100644 --- a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/GBaseProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/GBaseProvider.cs @@ -7,6 +7,8 @@ using System.Text; using System.Threading.Tasks; using System.Xml.Linq; using System.Data.Odbc; +using System.Text.RegularExpressions; + namespace SqlSugar.GBase { public class GBaseProvider : AdoProvider @@ -34,6 +36,96 @@ namespace SqlSugar.GBase base._DbConnection = value; } } + + public string SplitCommandTag => UtilConstants.ReplaceCommaKey.Replace("{", "").Replace("}", ""); + + + public override object GetScalar(string sql, params SugarParameter[] parameters) + { + if (sql == null) throw new Exception("sql is null"); + 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); + } + } + public override async Task GetScalarAsync(string sql, params SugarParameter[] parameters) + { + if (sql == null) throw new Exception("sql is null"); + 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) + { + if (sql == null) throw new Exception("sql is null"); + 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 ExecuteCommandAsync(string sql, SugarParameter [] parameters) + { + if (sql == null) throw new Exception("sql is null"); + 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 base.ExecuteCommand(sql, parameters); + } + } + /// /// Only GBase /// @@ -53,12 +145,22 @@ namespace SqlSugar.GBase CheckConnection(); base.Transaction = ((OdbcConnection)this.Connection).BeginTransaction(iso); } + public override IDataAdapter GetAdapter() { return new GBaseDataAdapter(); } public override DbCommand GetCommand(string sql, SugarParameter[] parameters) { + var helper = new GBaseInsertBuilder(); + 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) + ""); + } + } OdbcCommand sqlCommand = new OdbcCommand(sql, (OdbcConnection)this.Connection); sqlCommand.CommandType = this.CommandType; sqlCommand.CommandTimeout = this.CommandTimeOut; @@ -66,11 +168,11 @@ namespace SqlSugar.GBase { sqlCommand.Transaction = (OdbcTransaction)this.Transaction; } - if (parameters.HasValue()) - { - OdbcParameter[] ipars = GetSqlParameter(parameters); - sqlCommand.Parameters.AddRange(ipars); - } + //if (parameters.HasValue()) + //{ + // OdbcParameter[] ipars = GetSqlParameter(parameters); + // sqlCommand.Parameters.AddRange(ipars); + //} CheckConnection(); return sqlCommand; } diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseBuilder.cs b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseBuilder.cs index 59f01a937..cc5404154 100644 --- a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseBuilder.cs @@ -15,6 +15,36 @@ namespace SqlSugar.GBase { return name; } + 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; + } + } + } } diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseInsertBuilder.cs b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseInsertBuilder.cs index 18e5a7d2e..edf7f1877 100644 --- a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseInsertBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseInsertBuilder.cs @@ -8,6 +8,40 @@ namespace SqlSugar.GBase { public class GBaseInsertBuilder:InsertBuilder { + public override string SqlTemplate + { + get + { + if (IsReturnIdentity) + { + return @"INSERT INTO {0} + ({1}) + VALUES + ({2})"+UtilConstants.ReplaceCommaKey.Replace("{","").Replace("}", "") + " SELECT dbinfo('sqlca.sqlerrd1') FROM dual"; + } + else + { + return @"INSERT INTO {0} + ({1}) + VALUES + ({2}) "+UtilConstants.ReplaceCommaKey.Replace("{", "").Replace("}", "") + "SELECT dbinfo('sqlca.sqlerrd1') FROM dual"; + + } + } + } + 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) @@ -48,19 +82,83 @@ namespace SqlSugar.GBase { batchInsetrSql.Append(SqlTemplateBatchUnion); } - batchInsetrSql.Append("\r\n SELECT " + string.Join(",", columns.Select(it => string.Format(SqlTemplateBatchSelect, FormatValue(it.Value), Builder.GetTranslationColumnName(it.DbColumnName))))); + batchInsetrSql.Append("\r\n SELECT " + string.Join(",", columns.Select(it => string.Format(SqlTemplateBatchSelect, FormatValue(it.Value), Builder.GetTranslationColumnName(it.DbColumnName))))+" from dual"); ++i; } pageIndex++; batchInsetrSql.Append("\r\n;\r\n"); } var result = batchInsetrSql.ToString(); - if (this.Context.CurrentConnectionConfig.DbType == DbType.GBase) - { - result += "select SCOPE_IDENTITY();"; - } + //if (this.Context.CurrentConnectionConfig.DbType == DbType.GBase) + //{ + // result += ""; + //} return result; } } + public override object FormatValue(object value) + { + var n = ""; + if (value == null) + { + return "NULL"; + } + else + { + 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") + "'"; + } + } }