diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/DataTableExtensions/GBaseDataAdapter.cs b/Src/Asp.NetCore2/SqlSugar.GBaseCore/DataTableExtensions/GBaseDataAdapter.cs index c2069ce9d..a40f70730 100644 --- a/Src/Asp.NetCore2/SqlSugar.GBaseCore/DataTableExtensions/GBaseDataAdapter.cs +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/DataTableExtensions/GBaseDataAdapter.cs @@ -1,8 +1,9 @@ using System; using System.Collections.Generic; using System.Data; -using System.Data.Odbc; using System.Text; +using GBS.Data.GBasedbt; + namespace SqlSugar.GBase { /// @@ -10,15 +11,15 @@ namespace SqlSugar.GBase /// public class GBaseDataAdapter : IDataAdapter { - private OdbcCommand command; + private GbsCommand command; private string sql; - private OdbcConnection _sqlConnection; + private GbsConnection _sqlConnection; /// /// SqlDataAdapter /// /// - public GBaseDataAdapter(OdbcCommand command) + public GBaseDataAdapter(GbsCommand command) { this.command = command; } @@ -33,7 +34,7 @@ namespace SqlSugar.GBase /// /// /// - public GBaseDataAdapter(string sql, OdbcConnection _sqlConnection) + public GBaseDataAdapter(string sql, GbsConnection _sqlConnection) { this.sql = sql; this._sqlConnection = _sqlConnection; @@ -42,13 +43,13 @@ namespace SqlSugar.GBase /// /// SelectCommand /// - public OdbcCommand SelectCommand + public GbsCommand SelectCommand { get { if (this.command == null) { - var conn = (OdbcConnection)this._sqlConnection; + var conn = (GbsConnection)this._sqlConnection; this.command = conn.CreateCommand(); this.command.CommandText = sql; } diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/DbBind/GBaseDbBind.cs b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/DbBind/GBaseDbBind.cs index 0001c25b1..fdd893850 100644 --- a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/DbBind/GBaseDbBind.cs +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/DbBind/GBaseDbBind.cs @@ -34,7 +34,6 @@ namespace SqlSugar.GBase } public static List> MappingTypesConst = new List>() { - new KeyValuePair("numeric",CSharpDataType.@long), new KeyValuePair("bigint",CSharpDataType.@long), new KeyValuePair("blob",CSharpDataType.byteArray), new KeyValuePair("boolean",CSharpDataType.@bool), @@ -42,7 +41,7 @@ namespace SqlSugar.GBase new KeyValuePair("varchar", CSharpDataType.@string), new KeyValuePair("char",CSharpDataType.@string), new KeyValuePair("clob",CSharpDataType.@string), - new KeyValuePair("DATETIME YEAR TO FRACTION(3)", CSharpDataType.DateTime), + new KeyValuePair("DATETIME YEAR TO FRACTION(5)", CSharpDataType.DateTime), new KeyValuePair("datetime", CSharpDataType.DateTime), new KeyValuePair("date", CSharpDataType.DateTime), new KeyValuePair("decimal", CSharpDataType.@decimal), diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/GBaseProvider.cs b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/GBaseProvider.cs index ce71d17f5..35a9368f5 100644 --- a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/GBaseProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/GBaseProvider.cs @@ -6,8 +6,8 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; -using System.Data.Odbc; using System.Text.RegularExpressions; +using GBS.Data.GBasedbt; namespace SqlSugar.GBase { @@ -22,7 +22,7 @@ namespace SqlSugar.GBase { try { - base._DbConnection = new OdbcConnection(base.Context.CurrentConnectionConfig.ConnectionString); + base._DbConnection = new GbsConnection(base.Context.CurrentConnectionConfig.ConnectionString); } catch (Exception ex) { @@ -67,14 +67,14 @@ namespace SqlSugar.GBase { if (this.Context.Ado.Transaction != null) { - return await GetScalarAsync(sql, parameters); + return await _GetScalarAsync(sql, parameters); } else { try { this.Context.Ado.BeginTran(); - var result =await GetScalarAsync(sql, parameters); + var result = await _GetScalarAsync(sql, parameters); this.Context.Ado.CommitTran(); return result; } @@ -135,12 +135,20 @@ namespace SqlSugar.GBase { var sqlParts = Regex.Split(sql, this.SplitCommandTag).Where(it => !string.IsNullOrEmpty(it)).ToList(); int result = 0; + int i = 0; foreach (var item in sqlParts) { if (item.TrimStart('\r').TrimStart('\n') != "") { - result += base.ExecuteCommand(item, parameters); + // parameter name which has prefix is add by AddBatchInsertParameters(). + // it should be passed to Command row by row. + // the parameter which has same prefix is in the same row. + var namePrefix = i.ToString() + this.Context.Ado.SqlParameterKeyWord; + var paramParts = parameters.Where(o => string.Compare(o.ParameterName, 0, namePrefix, 0, namePrefix.Length) == 0).ToArray(); + + result += base.ExecuteCommand(item, paramParts.Length > 0 ? paramParts : parameters); } + ++i; } return result; } @@ -156,12 +164,20 @@ namespace SqlSugar.GBase { var sqlParts = Regex.Split(sql, this.SplitCommandTag).Where(it => !string.IsNullOrEmpty(it)).ToList(); int result = 0; + int i = 0; foreach (var item in sqlParts) { if (item.TrimStart('\r').TrimStart('\n') != "") { - result +=await base.ExecuteCommandAsync(item, parameters); + // parameter name which has prefix is add by AddBatchInsertParameters(). + // it should be passed to Command row by row. + // the parameter which has same prefix is in the same row. + var namePrefix = i.ToString() + this.Context.Ado.SqlParameterKeyWord; + var paramParts = parameters.Where(o => string.Compare(o.ParameterName, 0, namePrefix, 0, namePrefix.Length) == 0).ToArray(); + + result += await base.ExecuteCommandAsync(item, paramParts.Length > 0 ? paramParts : parameters); } + ++i; } return result; } @@ -178,7 +194,7 @@ namespace SqlSugar.GBase public override void BeginTran(string transactionName) { CheckConnection(); - base.Transaction = ((OdbcConnection)this.Connection).BeginTransaction(); + base.Transaction = ((GbsConnection)this.Connection).BeginTransaction(); } /// /// Only GBase @@ -188,7 +204,7 @@ namespace SqlSugar.GBase public override void BeginTran(IsolationLevel iso, string transactionName) { CheckConnection(); - base.Transaction = ((OdbcConnection)this.Connection).BeginTransaction(iso); + base.Transaction = ((GbsConnection)this.Connection).BeginTransaction(iso); } public override IDataAdapter GetAdapter() @@ -199,19 +215,67 @@ namespace SqlSugar.GBase { var helper = new GBaseInsertBuilder(); helper.Context = this.Context; + GbsCommand sqlCommand = ((GbsConnection)this.Connection).CreateCommand(); if (parameters != null) { + var bigObjectParams = parameters.Where(o => sql.Contains(o.ParameterName) &&UtilMethods.HasBigObjectParam(o)).ToList(); + + foreach (var param in bigObjectParams) + { + // for big object data, in the insert or update statements + // the charactor after the @ParameterName could only be , or ) or space. + // here use these characters as postfix of the parameter name. + // the Replace method would only replace one field each time. + sql = sql.Replace(param.ParameterName + ",", " ?, "); + sql = sql.Replace(param.ParameterName + ")", " ?) "); + sql = sql.Replace(param.ParameterName + " ", " ? "); + + var gbsParam = sqlCommand.CreateParameter(); + gbsParam.DbType = param.DbType; + gbsParam.ParameterName = param.ParameterName; + + // assign GbsType. + switch (param.TypeName) + { + case "blob": + gbsParam.GbsType = GbsType.Blob; + gbsParam.Value = (param.Value == null) ? string.Empty : param.Value; + break; + case "clob": + gbsParam.GbsType = GbsType.Clob; + gbsParam.Value = (param.Value == null) ? string.Empty : param.Value; + break; + case "text": + gbsParam.GbsType = GbsType.Text; + gbsParam.Value = (param.Value == null) ? DBNull.Value : param.Value; + break; + case "byte": + default: + gbsParam.GbsType = GbsType.Byte; + gbsParam.Value = (param.Value == null) ? DBNull.Value : param.Value; + break; + } + + sqlCommand.Parameters.Add(gbsParam); + } foreach (var param in parameters.OrderByDescending(it => it.ParameterName.Length)) { - sql = sql.Replace(param.ParameterName, helper.FormatValue(param.Value) + ""); + if (sql.Contains(param.ParameterName) && UtilMethods.HasBigObjectParam(param)) + { + continue; + } + else + { + sql = sql.Replace(param.ParameterName, helper.FormatValue(param.Value) + ""); + } } } - OdbcCommand sqlCommand = new OdbcCommand(sql, (OdbcConnection)this.Connection); + sqlCommand.CommandText = sql; sqlCommand.CommandType = this.CommandType; sqlCommand.CommandTimeout = this.CommandTimeOut; if (this.Transaction != null) { - sqlCommand.Transaction = (OdbcTransaction)this.Transaction; + sqlCommand.Transaction = (GbsTransaction)this.Transaction; } //if (parameters.HasValue()) //{ @@ -223,7 +287,7 @@ namespace SqlSugar.GBase } public override void SetCommandToAdapter(IDataAdapter dataAdapter, DbCommand command) { - ((GBaseDataAdapter)dataAdapter).SelectCommand = (OdbcCommand)command; + ((GBaseDataAdapter)dataAdapter).SelectCommand = (GbsCommand)command; } /// /// if mysql return MySqlParameter[] pars @@ -233,13 +297,13 @@ namespace SqlSugar.GBase /// public override IDataParameter[] ToIDbDataParameter(params SugarParameter[] parameters) { - if (parameters == null || parameters.Length == 0) return new OdbcParameter[] { }; - OdbcParameter[] result = new OdbcParameter[parameters.Length]; + if (parameters == null || parameters.Length == 0) return new GbsParameter[] { }; + GbsParameter[] result = new GbsParameter[parameters.Length]; int index = 0; foreach (var parameter in parameters) { if (parameter.Value == null) parameter.Value = DBNull.Value; - var sqlParameter = new OdbcParameter(); + var sqlParameter = new GbsParameter(); sqlParameter.ParameterName = parameter.ParameterName; //sqlParameter.UdtTypeName = parameter.UdtTypeName; sqlParameter.Size = parameter.Size; @@ -263,15 +327,15 @@ namespace SqlSugar.GBase /// /// /// - public OdbcParameter[] GetSqlParameter(params SugarParameter[] parameters) + public GbsParameter[] GetSqlParameter(params SugarParameter[] parameters) { if (parameters == null || parameters.Length == 0) return null; - OdbcParameter[] result = new OdbcParameter[parameters.Length]; + GbsParameter[] result = new GbsParameter[parameters.Length]; int index = 0; foreach (var parameter in parameters) { if (parameter.Value == null) parameter.Value = DBNull.Value; - var sqlParameter = new OdbcParameter(); + var sqlParameter = new GbsParameter(); sqlParameter.ParameterName = parameter.ParameterName; //sqlParameter.UdtTypeName = parameter.UdtTypeName; sqlParameter.Size = parameter.Size; diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseBuilder.cs b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseBuilder.cs index 6e8edaeab..df2ec576b 100644 --- a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseBuilder.cs @@ -15,9 +15,22 @@ namespace SqlSugar.GBase { if (name.Contains("=")) { - name = name.Split('=').First().Trim(); + name = name.Split('=').First(); } - return name; + name = name.Trim(' '); + + if (string.IsNullOrEmpty(SqlTranslationLeft) || + !name.Contains(SqlTranslationLeft)) + { + return name; + } + + if (!name.Contains(".") && name.StartsWith(SqlTranslationLeft) && name.EndsWith(SqlTranslationRight)) + { + return name.TrimStart(Convert.ToChar(SqlTranslationLeft)).TrimEnd(Convert.ToChar(SqlTranslationRight)); + } + + return name == null ? string.Empty : Regex.Match(name, @".*" + "\\" + SqlTranslationLeft + "(.*?)" + "\\" + SqlTranslationRight + "").Groups[1].Value; } public override string SqlDateNow { @@ -64,5 +77,4 @@ namespace SqlSugar.GBase } } - } diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseExpressionContext.cs b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseExpressionContext.cs index cc4fb7d54..d4b058d5f 100644 --- a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseExpressionContext.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.IO; using System.Linq; using System.Linq.Expressions; using System.Reflection; @@ -24,9 +25,21 @@ namespace SqlSugar.GBase return result; } public override string GetLimit() { return ""; } + public override string GetTranslationText(string name) + { + if (name.Contains('.')) + { + // add "\"" to support alias name format : table.column + // delimident=y should be added to connection string. + return base.GetTranslationText("\"" + name + "\""); + } + + return base.GetTranslationText(name); + } } public partial class GBaseMethod : DefaultDbMethod, IDbMethods { + private string _dateTimeType = "datetime year to fraction(5)"; public override string Length(MethodCallExpressionModel model) { var parameter = model.Args[0]; @@ -37,7 +50,16 @@ namespace SqlSugar.GBase { var parameter = model.Args[0]; var parameter1 = model.Args[1]; - return string.Format("NVL({0},{1})", parameter.MemberName, parameter1.MemberName); + string str = string.Format("NVL({0},{1})", parameter.MemberName, parameter1.MemberName); + + if (parameter1 != null && parameter1.MemberValue != null) + { + if (parameter1.MemberValue.GetType() == UtilConstants.DateType) + { + str += string.Format("::{0}", _dateTimeType); + } + } + return str; } public override string MergeString(params string[] strings) @@ -61,14 +83,56 @@ namespace SqlSugar.GBase { var parameter = model.Args[0]; var parameter2 = model.Args[1]; + string str = string.Empty; if (parameter.MemberName != null && parameter.MemberName is DateTime) { - return string.Format(" datepart({0},'{1}') ", parameter2.MemberValue, parameter.MemberName); + switch (parameter2.MemberValue.ToString().ToLower()) + { + case "year": + str = string.Format(" year('{0}'::{1}) ", parameter.MemberName, _dateTimeType); + break; + case "month": + str = string.Format(" month('{0}'::{1}) ", parameter.MemberName, _dateTimeType); + break; + case "day": + str = string.Format(" day('{0}'::{1}) ", parameter.MemberName, _dateTimeType); + break; + case "hour": + str = string.Format(" extend('{0}'::{1}, hour to hour) ", parameter.MemberName, _dateTimeType); + break; + case "minute": + str = string.Format(" extend('{0}'::{1}, minute to minute) ", parameter.MemberName, _dateTimeType); + break; + case "second": + str = string.Format(" extend('{0}'::{1}, second to second) ", parameter.MemberName, _dateTimeType); + break; + } } else { - return string.Format(" datepart({0},{1}) ", parameter2.MemberValue, parameter.MemberName); + switch (parameter2.MemberValue.ToString().ToLower()) + { + case "year": + str = string.Format(" year({0}::{1}) ", parameter.MemberName, _dateTimeType); + break; + case "month": + str = string.Format(" month({0}::{1}) ", parameter.MemberName, _dateTimeType); + break; + case "day": + str = string.Format(" day({0}::{1}) ", parameter.MemberName, _dateTimeType); + break; + case "hour": + str = string.Format(" extend({0}::{1}, hour to hour)::varchar(2) ", parameter.MemberName, _dateTimeType); + break; + case "minute": + str = string.Format(" extend({0}::{1}, minute to minute)::varchar(2) ", parameter.MemberName, _dateTimeType); + break; + case "second": + str = string.Format(" extend({0}::{1}, second to second)::varchar(2) ", parameter.MemberName, _dateTimeType); + break; + } } + return str; } public override string GetDate() { @@ -110,5 +174,59 @@ namespace SqlSugar.GBase var parameter2 = model.Args[1]; return string.Format(" ({0} like '%'||{1}) ", parameter.MemberName, parameter2.MemberName); } + public override string DateDiff(MethodCallExpressionModel model) + { + var parameter = model.Args[0]; + var parameter2 = model.Args[1]; + var parameter3 = model.Args[2]; + return string.Format(" DATEDIFF('{0}',{1},{2}) ", parameter.MemberValue?.ToString().ToSqlFilter(), parameter2.MemberName, parameter3.MemberName); + } + public override string ToString(MethodCallExpressionModel model) + { + var parameter = model.Args[0]; + return string.Format(" CAST({0} AS NVARCHAR(4000))", parameter.MemberName); + } + + public override string EqualTrue(string fieldName) + { + return "( " + fieldName + "='t' )"; + } + + public override string ToDate(MethodCallExpressionModel model) + { + var parameter = model.Args[0]; + return string.Format(" CAST({0} AS DATETIME year to fraction(5))", parameter.MemberName); + } + + public override string DateAddByType(MethodCallExpressionModel model) + { + var parameter = model.Args[0]; + var parameter2 = model.Args[1]; + var parameter3 = model.Args[2]; + string str = string.Empty; + switch (parameter3.MemberValue.ToString().ToLower()) + { + case "year": + str = string.Format(" ({0}::{2}+ {1} units year)", parameter.MemberName, parameter2.MemberName, _dateTimeType); + break; + case "month": + str = string.Format(" ({0}::{2}+ {1} units month)", parameter.MemberName, parameter2.MemberName, _dateTimeType); + break; + case "day": + str = string.Format(" ({0}::{2}+ {1} units day)", parameter.MemberName, parameter2.MemberName, _dateTimeType); + break; + case "hour": + str = string.Format(" ({0}::{2}+ {1} units hour)", parameter.MemberName, parameter2.MemberName, _dateTimeType); + break; + case "minute": + str = string.Format(" ({0}::{2}+ {1} units minute)", parameter.MemberName, parameter2.MemberName, _dateTimeType); + break; + case "second": + str = string.Format(" ({0}::{2}+ {1} units second)", parameter.MemberName, parameter2.MemberName, _dateTimeType); + break; + } + + return str; + } } } diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseInsertBuilder.cs b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseInsertBuilder.cs index 82d0c92eb..f3311cbbb 100644 --- a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseInsertBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseInsertBuilder.cs @@ -8,6 +8,8 @@ namespace SqlSugar.GBase { public class GBaseInsertBuilder:InsertBuilder { + private string _getAutoGeneratedKeyValueSql = " select case when dbinfo('serial8') <> 0 then dbinfo('serial8') when dbinfo('bigserial') <> 0 then dbinfo('bigserial') else dbinfo('sqlca.sqlerrd1') end from dual"; + public override string SqlTemplateBatch { get @@ -24,15 +26,14 @@ namespace SqlSugar.GBase return @"INSERT INTO {0} ({1}) VALUES - ({2})"+UtilConstants.ReplaceCommaKey.Replace("{","").Replace("}", "") + " SELECT dbinfo('sqlca.sqlerrd1') FROM dual"; + ({2})"+UtilConstants.ReplaceCommaKey.Replace("{","").Replace("}", "") + _getAutoGeneratedKeyValueSql; } else { return @"INSERT INTO {0} ({1}) VALUES - ({2}) "+UtilConstants.ReplaceCommaKey.Replace("{", "").Replace("}", "") + "SELECT dbinfo('sqlca.sqlerrd1') FROM dual"; - + ({2}) "; } } } @@ -41,10 +42,6 @@ namespace SqlSugar.GBase get { var result = Builder.GetTranslationTableName(EntityInfo.EntityName); - if (this.AsName.HasValue()) - { - return Builder.GetTranslationTableName(this.AsName); - } result += UtilConstants.Space; if (this.TableWithString.HasValue()) { @@ -64,7 +61,18 @@ namespace SqlSugar.GBase 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))); + // copy the SugarColumn(ColumnDataType) to parameter.TypeName + var bigObjectColumns = groupList.ToList().First().Where(o => !string.IsNullOrEmpty(o.DataType)).ToList(); + foreach (var column in bigObjectColumns) + { + var columnName = Builder.SqlParameterKeyWord + column.DbColumnName; + var param = this.Parameters.Where(o => string.Compare(o.ParameterName, columnName) == 0).FirstOrDefault(); + if (param.HasValue()) + { + param.TypeName = column.DataType.ToLower(); + } + } + string columnParametersString = string.Join(",", this.DbColumnInfoList.Select(it => base.GetDbColumn(it, Builder.SqlParameterKeyWord + it.DbColumnName))); return string.Format(SqlTemplate, GetTableNameString, columnsString, columnParametersString); } else @@ -74,23 +82,53 @@ namespace SqlSugar.GBase int pageIndex = 1; int totalRecord = groupList.Count; int pageCount = (totalRecord + pageSize - 1) / pageSize; + Boolean hasBigObjectColumn = groupList.First().Where(o => UtilMethods.HasBigObjectColumn(o)).Count() > 0; + + if (this.Parameters != null) this.Parameters.Clear(); + while (pageCount >= pageIndex) { - batchInsetrSql.AppendFormat(SqlTemplateBatch, GetTableNameString, columnsString); - batchInsetrSql.AppendFormat("SELECT * FROM ("); + if (!hasBigObjectColumn) + { + 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) + if (!hasBigObjectColumn) { - batchInsetrSql.Append(SqlTemplateBatchUnion); + 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"); + } + else + { + // has big object column. + if (!isFirst) + { + batchInsetrSql.Append(UtilConstants.ReplaceCommaKey.Replace("{", "").Replace("}", " ")); + } + + // generate batch insert sqlstatements, which has big object datatype column. + batchInsetrSql.AppendFormat(SqlTemplateBatch, GetTableNameString, columnsString); + batchInsetrSql.AppendFormat(" Values ("); + batchInsetrSql.AppendFormat(string.Join(",", columns.Select(it => base.GetDbColumn(it, i + Builder.SqlParameterKeyWord + it.DbColumnName + i)))); + batchInsetrSql.AppendFormat(");"); + + // multiple rows data would be added to the parameters + this.AddBatchInsertParameters(columns, i); } - 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"); + if (!hasBigObjectColumn) + { + batchInsetrSql.Append(") temp1\r\n;\r\n"); + } } var result = batchInsetrSql.ToString(); //if (this.Context.CurrentConnectionConfig.DbType == DbType.GBase) @@ -127,7 +165,7 @@ namespace SqlSugar.GBase { if (this.Context.CurrentConnectionConfig.MoreSettings?.TableEnumIsString == true) { - return value.ToSqlValue(); ; + return value.ToSqlValue(); } else { @@ -138,6 +176,14 @@ namespace SqlSugar.GBase { return string.Format("CAST({0} AS boolean)", value.ObjToBool()?1:0) ; } + else if (type == UtilConstants.IntType || + type == UtilConstants.LongType || + type == UtilConstants.ShortType || + type == UtilConstants.FloatType || + type == UtilConstants.DobType) + { + return value; + } else { return n + "'" + value + "'"; @@ -164,5 +210,71 @@ namespace SqlSugar.GBase return "'" + date.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'"; } + // the method below is copied from InsertableHelper.cs + private static void ArrayNull(DbColumnInfo item, SugarParameter parameter) + { + if (item.PropertyType.IsIn(typeof(Guid[]), typeof(Guid?[]))) + { + parameter.DbType = System.Data.DbType.Guid; + } + else if (item.PropertyType.IsIn(typeof(int[]), typeof(int?[]))) + { + parameter.DbType = System.Data.DbType.Int32; + } + else if (item.PropertyType.IsIn(typeof(long[]), typeof(long?[]))) + { + parameter.DbType = System.Data.DbType.Int64; + } + else if (item.PropertyType.IsIn(typeof(short[]), typeof(short?[]))) + { + parameter.DbType = System.Data.DbType.Int16; + } + } + + // The code in AddBatchInsertParameters are copied from PreToSql() in InsertableHelper.cs + private void AddBatchInsertParameters(IGrouping columns, int rowIndex) + { + var isDic = this.EntityInfo.DbTableName.StartsWith("Dictionary`"); + foreach (var item in columns) + { + if (this.Parameters == null) this.Parameters = new List(); + var paramters = new SugarParameter(rowIndex + Builder.SqlParameterKeyWord + item.DbColumnName + rowIndex, item.Value, item.PropertyType); + if (IsNoInsertNull && paramters.Value == null) + { + continue; + } + if (item.SqlParameterDbType is Type) + { + continue; + } + if (item.IsJson) + { + paramters.IsJson = true; + Builder.ChangeJsonType(paramters); + } + if (item.IsArray) + { + paramters.IsArray = true; + if (item.Value == null || item.Value == DBNull.Value) + { + ArrayNull(item, paramters); + } + + } + if (item.Value == null && isDic) + { + var type = this.Builder.GetNullType(this.GetTableNameString, item.DbColumnName); + if (type != null) + { + paramters = new SugarParameter(rowIndex + this.Builder.SqlParameterKeyWord + item.DbColumnName + rowIndex, item.Value, type); + } + } + if (!string.IsNullOrEmpty(item.DataType)) + { + paramters.TypeName = item.DataType.ToLower(); + } + this.Parameters.Add(paramters); + } + } } } diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseQueryBuilder.cs b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseQueryBuilder.cs index d8ea90c1b..b08ecc05a 100644 --- a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseQueryBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseQueryBuilder.cs @@ -17,7 +17,7 @@ namespace SqlSugar.GBase /* SELECT * FROM TABLE WHERE CONDITION ORDER BY ID DESC LIMIT 0,10 */ - var template = "SELECT {0} FROM {1} {2} {3} {4} LIMIT {5},{6}"; + var template = "SELECT SKIP {5} FIRST {6} {0} FROM {1} {2} {3} {4} "; return template; } } @@ -34,7 +34,7 @@ namespace SqlSugar.GBase #region Common Methods public override bool IsComplexModel(string sql) { - return Regex.IsMatch(sql, @"AS \`\w+\.\w+\`") || Regex.IsMatch(sql, @"AS \`\w+\.\w+\.\w+\`"); + return Regex.IsMatch(sql, @"AS ""\w+\.\w+""") || Regex.IsMatch(sql, @"AS ""\w+\.\w+\.\w+"""); } public override string ToSqlString() { diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseUpdateBuilder.cs b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseUpdateBuilder.cs index 88607e4ba..f85f18f13 100644 --- a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseUpdateBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GBase/SqlBuilder/GBaseUpdateBuilder.cs @@ -4,17 +4,26 @@ using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; +using SqlSugar; namespace SqlSugar.GBase { public class GBaseUpdateBuilder : UpdateBuilder { + public override string SqlTemplate + { + get + { + return @"UPDATE {0} SET {1} {2}"; + + } + } protected override string TomultipleSqlString(List> groupList) { - if (groupList == null || groupList.Count == 0) + 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 => @@ -31,7 +40,7 @@ namespace SqlSugar.GBase whereList.Add(whereString); } i++; - return string.Format("{0} {1} WHERE {2} ", updateTable, setValues, string.Join(" AND", whereList)); + return string.Format("{0} {1} WHERE {2} ", updateTable, setValues, string.Join(" AND ", whereList)); }).ToArray())); return sb.ToString(); } @@ -43,6 +52,73 @@ namespace SqlSugar.GBase { return string.Format("{0}={1}", m.DbColumnName, base.GetDbColumn(m,FormatValue(i, m.DbColumnName, m.Value, iswhere))); } + public override object FormatValue(object value) + { + if (value == null) + { + return "NULL"; + } + else + { + var type = UtilMethods.GetUnderType(value.GetType()); + if (type == UtilConstants.DateType) + { + 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") + "'"; + } + 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 if (type == UtilConstants.DateTimeOffsetType) + { + return FormatDateTimeOffset(value); + } + else if (type == UtilConstants.StringType || type == UtilConstants.ObjType) + { + return "'" + value.ToString().ToSqlFilter() + "'"; + } + else if (type == UtilConstants.IntType || type == UtilConstants.LongType) + { + return value; + } + else if (UtilMethods.IsNumber(type.Name)) + { + if (value.ObjToString().Contains(",")) + { + return $"'{value}'"; + } + else + { + return value; + } + } + else + { + return "'" + value.ToString() + "'"; + } + } + } public object FormatValue(int i, string name, object value, bool iswhere) { if (value == null) @@ -70,7 +146,7 @@ namespace SqlSugar.GBase } else if (type == UtilConstants.DateType && iswhere) { - var parameterName = this.Builder.SqlParameterKeyWord + name + i; + var parameterName = i + this.Builder.SqlParameterKeyWord + name + i; this.Parameters.Add(new SugarParameter(parameterName, value)); return parameterName; } @@ -87,7 +163,7 @@ namespace SqlSugar.GBase } else if (type == UtilConstants.ByteArrayType) { - var parameterName = this.Builder.SqlParameterKeyWord + name + i; + var parameterName = i + this.Builder.SqlParameterKeyWord + name + i; this.Parameters.Add(new SugarParameter(parameterName, value)); return parameterName; } diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/GeneralData.EntityFrameworkCore.GBase.DataProvider.dll b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GeneralData.EntityFrameworkCore.GBase.DataProvider.dll new file mode 100644 index 000000000..406c68a2e Binary files /dev/null and b/Src/Asp.NetCore2/SqlSugar.GBaseCore/GeneralData.EntityFrameworkCore.GBase.DataProvider.dll differ diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/SqlSugar.GBaseCore.csproj b/Src/Asp.NetCore2/SqlSugar.GBaseCore/SqlSugar.GBaseCore.csproj index afa11a591..46f5c2ad6 100644 --- a/Src/Asp.NetCore2/SqlSugar.GBaseCore/SqlSugar.GBaseCore.csproj +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/SqlSugar.GBaseCore.csproj @@ -6,7 +6,7 @@ - + diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/SqlSugar.GBaseCore.nuspec b/Src/Asp.NetCore2/SqlSugar.GBaseCore/SqlSugar.GBaseCore.nuspec index 438b023a3..5e5142983 100644 --- a/Src/Asp.NetCore2/SqlSugar.GBaseCore/SqlSugar.GBaseCore.nuspec +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/SqlSugar.GBaseCore.nuspec @@ -14,7 +14,7 @@ Asp.net core orm - + diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/Tools/UtilMethods.cs b/Src/Asp.NetCore2/SqlSugar.GBaseCore/Tools/UtilMethods.cs index 3b43c4776..f2dd5782a 100644 --- a/Src/Asp.NetCore2/SqlSugar.GBaseCore/Tools/UtilMethods.cs +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/Tools/UtilMethods.cs @@ -503,5 +503,101 @@ namespace SqlSugar.GBase // return item.FieldValue; // } //} + public static Boolean HasBigObjectParam(SugarParameter param) + { + return param.HasValue() && !string.IsNullOrEmpty(param.ParameterName) && + (param.DbType == System.Data.DbType.Binary || + (!string.IsNullOrEmpty(param.TypeName) && + (param.TypeName == "blob" || + param.TypeName == "clob" || + param.TypeName == "byte" || + param.TypeName == "text"))); + } + public static Boolean HasBigObjectColumn(DbColumnInfo columnInfo) + { + return columnInfo.HasValue() && + (columnInfo.PropertyType == UtilConstants.ByteArrayType || + (!string.IsNullOrEmpty(columnInfo.DataType) && + (columnInfo.DataType.ToLower() == "text" || + columnInfo.DataType.ToLower() == "byte" || + columnInfo.DataType.ToLower() == "clob" || + columnInfo.DataType.ToLower() == "blob"))); + } + + public static bool IsNumber(string ctypename) + { + if (ctypename.IsNullOrEmpty()) + { + return false; + } + var item = new ConditionalModel() + { + CSharpTypeName = ctypename, + }; + if (item.CSharpTypeName.EqualCase(UtilConstants.DecType.Name)) + { + return true; + } + else if (item.CSharpTypeName.EqualCase(UtilConstants.DobType.Name)) + { + return true; + } + else if (item.CSharpTypeName.EqualCase(UtilConstants.IntType.Name)) + { + return true; + } + else if (item.CSharpTypeName.EqualCase(UtilConstants.LongType.Name)) + { + return true; + } + else if (item.CSharpTypeName.EqualCase(UtilConstants.ShortType.Name)) + { + return true; + } + else if (item.CSharpTypeName.EqualCase("int")) + { + return true; + } + else if (item.CSharpTypeName.EqualCase("long")) + { + return true; + } + else if (item.CSharpTypeName.EqualCase("short")) + { + return true; + } + else if (item.CSharpTypeName.EqualCase("byte")) + { + return true; + } + else if (item.CSharpTypeName.EqualCase("uint")) + { + return true; + } + else if (item.CSharpTypeName.EqualCase("ulong")) + { + return true; + } + else if (item.CSharpTypeName.EqualCase("ushort")) + { + return true; + } + else if (item.CSharpTypeName.EqualCase("uint32")) + { + return true; + } + else if (item.CSharpTypeName.EqualCase("uint64")) + { + return true; + } + else if (item.CSharpTypeName.EqualCase("uint16")) + { + return true; + } + else + { + return false; + } + } } } diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/data.bat b/Src/Asp.NetCore2/SqlSugar.GBaseCore/data.bat new file mode 100644 index 000000000..0c8b3340e --- /dev/null +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/data.bat @@ -0,0 +1 @@ +%~dp0nuget.exe pack %~dp0data.nuspec -OutputDirectory %~dp0 \ No newline at end of file diff --git a/Src/Asp.NetCore2/SqlSugar.GBaseCore/data.nuspec b/Src/Asp.NetCore2/SqlSugar.GBaseCore/data.nuspec new file mode 100644 index 000000000..5ea9d7e71 --- /dev/null +++ b/Src/Asp.NetCore2/SqlSugar.GBaseCore/data.nuspec @@ -0,0 +1,22 @@ + + + + GBase.DataProvider + 1.1 + sunkaixuan + Landa + http://www.apache.org/licenses/LICENSE-2.0.html + https://github.com/sunkaixuan/SqlSugar + https://secure.gravatar.com/avatar/a82c03402497b2e58fd65038a3699b30 + false + SqlSugar操作 GBase 南大通用数据库 + Copyright 2016 + Asp.net core orm + + + + + + + + \ No newline at end of file