From 9c12cfc28b0ca7ed192749e7026b6108c60b8994 Mon Sep 17 00:00:00 2001
From: sunkaixuna <610262374@qq.com>
Date: Sun, 6 Feb 2022 16:08:31 +0800
Subject: [PATCH] Update core
---
.../SqlSeverTest/SqlSeverTest.sln | 13 +-
.../DataTableExtensions/MySqlDataAdapter.cs | 156 ++++++
.../MySql/CodeFirst/MySqlCodeFirst.cs | 80 +++
.../MySql/DbBind/MySqlDbBind.cs | 97 ++++
.../MySql/DbFirst/MySqlDbFirst.cs | 11 +
.../MySql/DbMaintenance/MySqlDbMaintenance.cs | 464 +++++++++++++++++
.../MySql/MySqlProvider.cs | 310 +++++++++++
.../MySql/Queryable/MySqlQueryable.cs | 60 +++
.../MySql/SqlBuilder/MySqlBlukCopy.cs | 202 +++++++
.../MySql/SqlBuilder/MySqlBuilder.cs | 26 +
.../MySql/SqlBuilder/MySqlDeleteBuilder.cs | 7 +
.../SqlBuilder/MySqlExpressionContext.cs | 154 ++++++
.../MySql/SqlBuilder/MySqlFastBuilder.cs | 74 +++
.../MySql/SqlBuilder/MySqlInsertBuilder.cs | 136 +++++
.../MySql/SqlBuilder/MySqlQueryBuilder.cs | 138 +++++
.../MySql/SqlBuilder/MySqlUpdateBuilder.cs | 155 ++++++
.../SqlSugar.MySqlConnectorCore.csproj | 15 +
.../Tools/ErrorMessage.cs | 64 +++
.../Tools/FileHelper.cs | 70 +++
.../Tools/UtilConstants.cs | 73 +++
.../Tools/UtilExtensions.cs | 123 +++++
.../Tools/UtilMethods.cs | 493 ++++++++++++++++++
.../Tools/ValidateExtensions.cs | 172 ++++++
.../Abstract/AdoProvider/AdoProvider.cs | 16 +-
.../Abstract/FastestProvider/Private.cs | 4 +-
.../SugarProvider/SqlSugarAccessory.cs | 10 +
.../UpdateProvider/UpdateableProvider.cs | 4 +-
.../SqlSugar/Entities/ConnMoreSettings.cs | 1 +
.../SqlSeverTest/SqlSugar/Enum/DbType.cs | 5 +-
.../MethodCallExpressionResolve.cs | 8 +-
.../Infrastructure/InstanceFactory.cs | 76 ++-
31 files changed, 3197 insertions(+), 20 deletions(-)
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/DataTableExtensions/MySqlDataAdapter.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/CodeFirst/MySqlCodeFirst.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/DbBind/MySqlDbBind.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/DbFirst/MySqlDbFirst.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/DbMaintenance/MySqlDbMaintenance.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/MySqlProvider.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/Queryable/MySqlQueryable.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/SqlBuilder/MySqlBlukCopy.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/SqlBuilder/MySqlBuilder.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/SqlBuilder/MySqlDeleteBuilder.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/SqlBuilder/MySqlExpressionContext.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/SqlBuilder/MySqlFastBuilder.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/SqlBuilder/MySqlInsertBuilder.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/SqlBuilder/MySqlQueryBuilder.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/SqlBuilder/MySqlUpdateBuilder.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/SqlSugar.MySqlConnectorCore.csproj
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/Tools/ErrorMessage.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/Tools/FileHelper.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/Tools/UtilConstants.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/Tools/UtilExtensions.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/Tools/UtilMethods.cs
create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/Tools/ValidateExtensions.cs
diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest.sln b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest.sln
index 5ce526877..51a60b16d 100644
--- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest.sln
+++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest.sln
@@ -25,7 +25,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CacheTest", "CacheTest\Cach
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OscarTest", "OscarTest\OscarTest.csproj", "{29925F8E-6495-463A-ABBD-C050AE85E130}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DbFirstRazorTest", "DbFirstRazorTest\DbFirstRazorTest.csproj", "{EE197EB0-C494-4478-A5CD-545E7139202E}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DbFirstRazorTest", "DbFirstRazorTest\DbFirstRazorTest.csproj", "{EE197EB0-C494-4478-A5CD-545E7139202E}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SqlSugar.CustomDatabase", "SqlSugar.CustomDatabase", "{88992AAF-146B-4253-9AD7-493E8F415B57}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlSugar.MySqlConnectorCore", "SqlSugar.MySqlConnectorCore\SqlSugar.MySqlConnectorCore.csproj", "{D22873F3-80E1-4415-9CD6-21B1C7EEA4A0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -81,10 +85,17 @@ Global
{EE197EB0-C494-4478-A5CD-545E7139202E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EE197EB0-C494-4478-A5CD-545E7139202E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EE197EB0-C494-4478-A5CD-545E7139202E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D22873F3-80E1-4415-9CD6-21B1C7EEA4A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D22873F3-80E1-4415-9CD6-21B1C7EEA4A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D22873F3-80E1-4415-9CD6-21B1C7EEA4A0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D22873F3-80E1-4415-9CD6-21B1C7EEA4A0}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {D22873F3-80E1-4415-9CD6-21B1C7EEA4A0} = {88992AAF-146B-4253-9AD7-493E8F415B57}
+ EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {230A85B9-54F1-41B1-B1DA-80086581B2B4}
EndGlobalSection
diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/DataTableExtensions/MySqlDataAdapter.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/DataTableExtensions/MySqlDataAdapter.cs
new file mode 100644
index 000000000..b8af8dfa9
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/DataTableExtensions/MySqlDataAdapter.cs
@@ -0,0 +1,156 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Text;
+using MySqlConnector;
+
+namespace SqlSugar.MySqlConnectorCore
+{
+ ///
+ /// 数据填充器
+ ///
+ public class MySqlConnectorDataAdapter : IDataAdapter
+ {
+ private MySqlCommand command;
+ private string sql;
+ private MySqlConnection _sqlConnection;
+
+ ///
+ /// SqlDataAdapter
+ ///
+ ///
+ public MySqlConnectorDataAdapter(MySqlCommand command)
+ {
+ this.command = command;
+ }
+
+ public MySqlConnectorDataAdapter()
+ {
+
+ }
+
+ ///
+ /// SqlDataAdapter
+ ///
+ ///
+ ///
+ public MySqlConnectorDataAdapter(string sql, MySqlConnection _sqlConnection)
+ {
+ this.sql = sql;
+ this._sqlConnection = _sqlConnection;
+ }
+
+ ///
+ /// SelectCommand
+ ///
+ public MySqlCommand SelectCommand
+ {
+ get
+ {
+ if (this.command == null)
+ {
+ this.command = new MySqlCommand(this.sql, this._sqlConnection);
+ }
+ return this.command;
+ }
+ set
+ {
+ this.command = value;
+ }
+ }
+
+ ///
+ /// Fill
+ ///
+ ///
+ public void Fill(DataTable dt)
+ {
+ if (dt == null)
+ {
+ dt = new DataTable();
+ }
+ var columns = dt.Columns;
+ var rows = dt.Rows;
+ using (MySqlDataReader dr = command.ExecuteReader())
+ {
+ for (int i = 0; i < dr.FieldCount; i++)
+ {
+ string name = dr.GetName(i).Trim();
+ if (!columns.Contains(name))
+ columns.Add(new DataColumn(name, dr.GetFieldType(i)));
+ else
+ {
+ columns.Add(new DataColumn(name + i, dr.GetFieldType(i)));
+ }
+ }
+
+ while (dr.Read())
+ {
+ DataRow daRow = dt.NewRow();
+ for (int i = 0; i < columns.Count; i++)
+ {
+ daRow[columns[i].ColumnName] = dr.GetValue(i);
+ }
+ dt.Rows.Add(daRow);
+ }
+ }
+ dt.AcceptChanges();
+ }
+
+ ///
+ /// Fill
+ ///
+ ///
+ public void Fill(DataSet ds)
+ {
+ if (ds == null)
+ {
+ ds = new DataSet();
+ }
+ using (MySqlDataReader dr = command.ExecuteReader())
+ {
+ do
+ {
+ var dt = new DataTable();
+ var columns = dt.Columns;
+ var rows = dt.Rows;
+ for (int i = 0; i < dr.FieldCount; i++)
+ {
+ string name = dr.GetName(i).Trim();
+ if (dr.GetFieldType(i).Name == "MySqlDateTime")
+ {
+ if (!columns.Contains(name))
+ columns.Add(new DataColumn(name, UtilConstants.DateType));
+ else
+ {
+ columns.Add(new DataColumn(name + i, UtilConstants.DateType));
+ }
+ }
+ else
+ {
+ if (!columns.Contains(name))
+ columns.Add(new DataColumn(name, dr.GetFieldType(i)));
+ else
+ {
+ columns.Add(new DataColumn(name + i, dr.GetFieldType(i)));
+ }
+ }
+ }
+
+ while (dr.Read())
+ {
+ DataRow daRow = dt.NewRow();
+ for (int i = 0; i < columns.Count; i++)
+ {
+ daRow[columns[i].ColumnName] = dr.GetValue(i);
+ }
+ dt.Rows.Add(daRow);
+ }
+ dt.AcceptChanges();
+ ds.Tables.Add(dt);
+ } while (dr.NextResult());
+ }
+ }
+ }
+
+}
diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/CodeFirst/MySqlCodeFirst.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/CodeFirst/MySqlCodeFirst.cs
new file mode 100644
index 000000000..11f711fb0
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/CodeFirst/MySqlCodeFirst.cs
@@ -0,0 +1,80 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace SqlSugar.MySqlConnectorCore
+{
+ public class MySqlCodeFirst : CodeFirstProvider
+ {
+ public override void NoExistLogic(EntityInfo entityInfo)
+ {
+ var tableName = GetTableName(entityInfo);
+ //Check.Exception(entityInfo.Columns.Where(it => it.IsPrimarykey).Count() > 1, "Use Code First ,The primary key must not exceed 1");
+ List columns = new List();
+ if (entityInfo.Columns.HasValue())
+ {
+ foreach (var item in entityInfo.Columns.OrderBy(it => it.IsPrimarykey ? 0 : 1))
+ {
+ if (item.IsIgnore)
+ continue;
+ if (item.PropertyInfo!=null&&UtilMethods.GetUnderType(item.PropertyInfo.PropertyType) == UtilConstants.GuidType && item.Length == 0&&item.DataType==null)
+ {
+ item.Length = Guid.NewGuid().ToString().Length;
+ }
+ DbColumnInfo dbColumnInfo = this.EntityColumnToDbColumn(entityInfo, tableName, item);
+ columns.Add(dbColumnInfo);
+ }
+ }
+ this.Context.DbMaintenance.CreateTable(tableName, columns,true);
+ }
+ protected override DbColumnInfo EntityColumnToDbColumn(EntityInfo entityInfo, string tableName, EntityColumnInfo item)
+ {
+ var propertyType = UtilMethods.GetUnderType(item.PropertyInfo);
+ var result = new DbColumnInfo()
+ {
+ TableId = entityInfo.Columns.IndexOf(item),
+ DbColumnName = item.DbColumnName.HasValue() ? item.DbColumnName : item.PropertyName,
+ IsPrimarykey = item.IsPrimarykey,
+ IsIdentity = item.IsIdentity,
+ TableName = tableName,
+ IsNullable = item.IsNullable,
+ DefaultValue = item.DefaultValue,
+ ColumnDescription = item.ColumnDescription,
+ Length = item.Length,
+ DecimalDigits=item.DecimalDigits
+ };
+ GetDbType(item, propertyType, result);
+ if (result.DataType.Equals("varchar", StringComparison.CurrentCultureIgnoreCase) && result.Length == 0)
+ {
+ result.Length = 1;
+ }
+ return result;
+ }
+
+ protected override void ConvertColumns(List dbColumns)
+ {
+ foreach (var item in dbColumns)
+ {
+ if (item.DataType == "DateTime")
+ {
+ item.Length = 0;
+ }
+ }
+ }
+
+ protected override void ChangeKey(EntityInfo entityInfo, string tableName, EntityColumnInfo item)
+ {
+ this.Context.DbMaintenance.UpdateColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item));
+ if (!item.IsPrimarykey)
+ this.Context.DbMaintenance.DropConstraint(tableName,null);
+ if (item.IsPrimarykey)
+ this.Context.DbMaintenance.AddPrimaryKey(tableName, item.DbColumnName);
+ }
+
+ internal DbColumnInfo GetEntityColumnToDbColumn(EntityInfo entity, string dbTableName, EntityColumnInfo item)
+ {
+ return EntityColumnToDbColumn(entity,dbTableName,item);
+ }
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/DbBind/MySqlDbBind.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/DbBind/MySqlDbBind.cs
new file mode 100644
index 000000000..13193a382
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/DbBind/MySqlDbBind.cs
@@ -0,0 +1,97 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace SqlSugar.MySqlConnectorCore
+{
+ public class MySqlDbBind : DbBindProvider
+ {
+ public override string GetDbTypeName(string csharpTypeName)
+ {
+ if (csharpTypeName == UtilConstants.ByteArrayType.Name)
+ {
+ return "blob";
+ }
+ if (csharpTypeName == "Int32")
+ csharpTypeName = "int";
+ if (csharpTypeName == "Int16")
+ csharpTypeName = "short";
+ if (csharpTypeName == "Int64")
+ csharpTypeName = "long";
+ if (csharpTypeName == "Boolean")
+ csharpTypeName = "bool";
+ if (csharpTypeName == "SByte")
+ csharpTypeName = "Byte";
+ if (csharpTypeName == "DateTimeOffset")
+ csharpTypeName = "DateTime";
+ var mappings = this.MappingTypes.Where(it => it.Value.ToString().Equals(csharpTypeName, StringComparison.CurrentCultureIgnoreCase));
+ return mappings.HasValue() ? mappings.First().Key : "varchar";
+ }
+ public override List> 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> MappingTypesConst = new List>(){
+
+ new KeyValuePair("int",CSharpDataType.@int),
+ new KeyValuePair("mediumint",CSharpDataType.@int),
+ new KeyValuePair("integer",CSharpDataType.@int),
+
+ new KeyValuePair("varchar",CSharpDataType.@string),
+ new KeyValuePair("text",CSharpDataType.@string),
+ new KeyValuePair("char",CSharpDataType.@string),
+ new KeyValuePair("enum",CSharpDataType.@string),
+ new KeyValuePair("mediumtext",CSharpDataType.@string),
+ new KeyValuePair("tinytext",CSharpDataType.@string),
+ new KeyValuePair("longtext",CSharpDataType.@string),
+
+ new KeyValuePair("tinyint",CSharpDataType.@byte),
+ new KeyValuePair("smallint",CSharpDataType.@short),
+ new KeyValuePair("bigint",CSharpDataType.@long),
+ new KeyValuePair("bit",CSharpDataType.@bool),
+ new KeyValuePair("real",CSharpDataType.@double),
+ new KeyValuePair("double",CSharpDataType.@double),
+ new KeyValuePair("float",CSharpDataType.@float),
+ new KeyValuePair("float",CSharpDataType.Single),
+ new KeyValuePair("decimal",CSharpDataType.@decimal),
+ new KeyValuePair("numeric",CSharpDataType.@decimal),
+ new KeyValuePair("year",CSharpDataType.@int),
+
+ new KeyValuePair("datetime",CSharpDataType.DateTime),
+ new KeyValuePair("timestamp",CSharpDataType.DateTime),
+ new KeyValuePair("date",CSharpDataType.DateTime),
+ new KeyValuePair("time",CSharpDataType.DateTime),
+
+ new KeyValuePair("blob",CSharpDataType.byteArray),
+ new KeyValuePair("longblob",CSharpDataType.byteArray),
+ new KeyValuePair("tinyblob",CSharpDataType.byteArray),
+ new KeyValuePair("varbinary",CSharpDataType.byteArray),
+ new KeyValuePair("binary",CSharpDataType.byteArray),
+ new KeyValuePair("multipoint",CSharpDataType.byteArray),
+ new KeyValuePair("geometry",CSharpDataType.byteArray),
+ new KeyValuePair("multilinestring",CSharpDataType.byteArray),
+ new KeyValuePair("polygon",CSharpDataType.byteArray),
+ new KeyValuePair("mediumblob",CSharpDataType.byteArray),
+
+ new KeyValuePair("varchar",CSharpDataType.Guid),
+ };
+ public override List StringThrow
+ {
+ get
+ {
+ return new List() { "int32", "datetime", "decimal", "double", "byte" };
+ }
+ }
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/DbFirst/MySqlDbFirst.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/DbFirst/MySqlDbFirst.cs
new file mode 100644
index 000000000..7d86e1a22
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/DbFirst/MySqlDbFirst.cs
@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace SqlSugar.MySqlConnectorCore
+{
+ public class MySqlDbFirst : DbFirstProvider
+ {
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/DbMaintenance/MySqlDbMaintenance.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/DbMaintenance/MySqlDbMaintenance.cs
new file mode 100644
index 000000000..b8a1ebf35
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/DbMaintenance/MySqlDbMaintenance.cs
@@ -0,0 +1,464 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+
+namespace SqlSugar.MySqlConnectorCore
+{
+ public class MySqlDbMaintenance : DbMaintenanceProvider
+ {
+ #region DML
+ protected override string GetDataBaseSql
+ {
+ get
+ {
+ return "SHOW DATABASES";
+ }
+ }
+ protected override string GetColumnInfosByTableNameSql
+ {
+ get
+ {
+ string sql = @"SELECT
+ 0 as TableId,
+ TABLE_NAME as TableName,
+ column_name AS DbColumnName,
+ CASE WHEN left(COLUMN_TYPE,LOCATE('(',COLUMN_TYPE)-1)='' THEN COLUMN_TYPE ELSE left(COLUMN_TYPE,LOCATE('(',COLUMN_TYPE)-1) END AS DataType,
+ CAST(SUBSTRING(COLUMN_TYPE,LOCATE('(',COLUMN_TYPE)+1,LOCATE(')',COLUMN_TYPE)-LOCATE('(',COLUMN_TYPE)-1) AS signed) AS Length,
+ column_default AS `DefaultValue`,
+ column_comment AS `ColumnDescription`,
+ CASE WHEN COLUMN_KEY = 'PRI'
+ THEN true ELSE false END AS `IsPrimaryKey`,
+ CASE WHEN EXTRA='auto_increment' THEN true ELSE false END as IsIdentity,
+ CASE WHEN is_nullable = 'YES'
+ THEN true ELSE false END AS `IsNullable`,
+ numeric_scale as Scale,
+ numeric_scale as DecimalDigits
+ FROM
+ Information_schema.columns where TABLE_NAME='{0}' and TABLE_SCHEMA=(select database()) ORDER BY ordinal_position";
+ return sql;
+ }
+ }
+ protected override string GetTableInfoListSql
+ {
+ get
+ {
+ return @"select TABLE_NAME as Name,TABLE_COMMENT as Description from information_schema.tables
+ where TABLE_SCHEMA=(select database()) AND TABLE_TYPE='BASE TABLE'";
+ }
+ }
+ protected override string GetViewInfoListSql
+ {
+ get
+ {
+ return @"select TABLE_NAME as Name,TABLE_COMMENT as Description from information_schema.tables
+ where TABLE_SCHEMA=(select database()) AND TABLE_TYPE='VIEW'
+ ";
+ }
+ }
+ #endregion
+
+ #region DDL
+ protected override string CreateDataBaseSql
+ {
+ get
+ {
+ return "CREATE DATABASE `{0}` CHARACTER SET utf8 COLLATE utf8_general_ci ";
+ }
+ }
+ protected override string AddPrimaryKeySql
+ {
+ get
+ {
+ return "ALTER TABLE {0} ADD PRIMARY KEY({2}) /*{1}*/";
+ }
+ }
+ protected override string AddColumnToTableSql
+ {
+ get
+ {
+ return "ALTER TABLE {0} ADD {1} {2}{3} {4} {5} {6}";
+ }
+ }
+ protected override string AlterColumnToTableSql
+ {
+ get
+ {
+ // return "ALTER TABLE {0} ALTER COLUMN {1} {2}{3} {4} {5} {6}";
+ return "alter table {0} change column {1} {1} {2}{3} {4} {5} {6}";
+ }
+ }
+ protected override string BackupDataBaseSql
+ {
+ get
+ {
+ return "mysqldump.exe {0} -uroot -p > {1} ";
+ }
+ }
+ protected override string CreateTableSql
+ {
+ get
+ {
+ return "CREATE TABLE {0}(\r\n{1} $PrimaryKey)";
+ }
+ }
+ protected override string CreateTableColumn
+ {
+ get
+ {
+ return "{0} {1}{2} {3} {4} {5}";
+ }
+ }
+ protected override string TruncateTableSql
+ {
+ get
+ {
+ return "TRUNCATE TABLE {0}";
+ }
+ }
+ protected override string BackupTableSql
+ {
+ get
+ {
+ return "Create table {1} (Select * from {2} LIMIT 0,{0})";
+ }
+ }
+ protected override string DropTableSql
+ {
+ get
+ {
+ return "DROP TABLE {0}";
+ }
+ }
+ protected override string DropColumnToTableSql
+ {
+ get
+ {
+ return "ALTER TABLE {0} DROP COLUMN {1}";
+ }
+ }
+ protected override string DropConstraintSql
+ {
+ get
+ {
+ return "ALTER TABLE {0} drop primary key;";
+ }
+ }
+ protected override string RenameColumnSql
+ {
+ get
+ {
+ return "alter table {0} change column {1} {2}";
+ }
+ }
+ #endregion
+
+ #region Check
+ protected override string CheckSystemTablePermissionsSql
+ {
+ get
+ {
+ return "select 1 from Information_schema.columns limit 0,1";
+ }
+ }
+ #endregion
+
+ #region Scattered
+ protected override string CreateTableNull
+ {
+ get
+ {
+ return "DEFAULT NULL";
+ }
+ }
+ protected override string CreateTableNotNull
+ {
+ get
+ {
+ return "NOT NULL";
+ }
+ }
+ protected override string CreateTablePirmaryKey
+ {
+ get
+ {
+ return "PRIMARY KEY";
+ }
+ }
+ protected override string CreateTableIdentity
+ {
+ get
+ {
+ return "AUTO_INCREMENT";
+ }
+ }
+
+ protected override string AddColumnRemarkSql
+ {
+ get
+ {
+ throw new NotSupportedException();
+ }
+ }
+
+ protected override string DeleteColumnRemarkSql
+ {
+ get
+ {
+ throw new NotSupportedException();
+ }
+ }
+
+ protected override string IsAnyColumnRemarkSql
+ {
+ get
+ {
+ throw new NotSupportedException();
+ }
+ }
+
+ protected override string AddTableRemarkSql
+ {
+ get
+ {
+ return "ALTER TABLE {0} COMMENT='{1}';";
+ }
+ }
+
+ protected override string DeleteTableRemarkSql
+ {
+ get
+ {
+ return "ALTER TABLE {0} COMMENT='';";
+ }
+ }
+
+ protected override string IsAnyTableRemarkSql
+ {
+ get
+ {
+ throw new NotSupportedException();
+ }
+ }
+
+ protected override string RenameTableSql {
+ get
+ {
+ return "alter table {0} rename {1}";
+ }
+ }
+
+ protected override string CreateIndexSql
+ {
+ get
+ {
+ return "CREATE {3} INDEX `Index_{0}_{2}` ON `{0}` ({1})";
+ }
+ }
+
+ protected override string AddDefaultValueSql
+ {
+ get
+ {
+ return "ALTER TABLE `{0}` ALTER COLUMN `{1}` SET DEFAULT '{2}'";
+ }
+ }
+ protected override string IsAnyIndexSql
+ {
+ get
+ {
+ return "SELECT count(*) FROM information_schema.statistics WHERE index_name = '{0}'";
+ }
+ }
+ #endregion
+
+ #region Methods
+ ///
+ ///by current connection string
+ ///
+ ///
+ ///
+ public override bool CreateDatabase(string databaseName, string databaseDirectory = null)
+ {
+ if (databaseDirectory != null)
+ {
+ if (!FileHelper.IsExistDirectory(databaseDirectory))
+ {
+ FileHelper.CreateDirectory(databaseDirectory);
+ }
+ }
+ var oldDatabaseName = this.Context.Ado.Connection.Database;
+ var connection = this.Context.CurrentConnectionConfig.ConnectionString;
+ Check.Exception(Regex.Split(connection,oldDatabaseName).Length > 2, "The user name and password cannot be the same as the database name ");
+ connection = connection.Replace(oldDatabaseName, "mysql");
+ var newDb = new SqlSugarClient(new ConnectionConfig()
+ {
+ DbType = this.Context.CurrentConnectionConfig.DbType,
+ IsAutoCloseConnection = true,
+ ConnectionString = connection
+ });
+ if (!GetDataBaseList(newDb).Any(it => it.Equals(databaseName, StringComparison.CurrentCultureIgnoreCase)))
+ {
+ newDb.Ado.ExecuteCommand(string.Format(CreateDataBaseSql, databaseName, databaseDirectory));
+ }
+ return true;
+ }
+ public override bool AddTableRemark(string tableName, string description)
+ {
+ string sql = string.Format(this.AddTableRemarkSql, this.SqlBuilder.GetTranslationTableName(tableName), description);
+ this.Context.Ado.ExecuteCommand(sql);
+ return true;
+ }
+ public override bool CreateTable(string tableName, List columns, bool isCreatePrimaryKey = true)
+ {
+ if (columns.HasValue())
+ {
+ foreach (var item in columns)
+ {
+ if (item.DbColumnName.Equals("GUID",StringComparison.CurrentCultureIgnoreCase)&&item.Length==0)
+ {
+ item.Length = 10;
+ }
+ }
+ }
+ string sql = GetCreateTableSql(tableName, columns);
+ string primaryKeyInfo = null;
+ if (columns.Any(it => it.IsPrimarykey)&&isCreatePrimaryKey) {
+ primaryKeyInfo =string.Format( ", Primary key({0})",string.Join(",",columns.Where(it=>it.IsPrimarykey).Select(it=>this.SqlBuilder.GetTranslationColumnName(it.DbColumnName))));
+
+ }
+ sql = sql.Replace("$PrimaryKey", primaryKeyInfo);
+ this.Context.Ado.ExecuteCommand(sql);
+ return true;
+ }
+ public override bool AddRemark(EntityInfo entity)
+ {
+ var db = this.Context;
+ db.DbMaintenance.AddTableRemark(entity.DbTableName, entity.TableDescription);
+ List columns = entity.Columns.Where(it => it.IsIgnore == false).ToList();
+ foreach (var item in columns)
+ {
+ if (item.ColumnDescription != null)
+ {
+ var mySqlCodeFirst = this.Context.CodeFirst as MySqlCodeFirst;
+ string sql = GetUpdateColumnSql(entity.DbTableName, mySqlCodeFirst.GetEntityColumnToDbColumn(entity, entity.DbTableName, item))+" "+(item.IsIdentity? "AUTO_INCREMENT" : "")+" " + " COMMENT '" + item.ColumnDescription + "'";
+ db.Ado.ExecuteCommand(sql);
+ }
+ }
+ return true;
+ }
+ protected override string GetCreateTableSql(string tableName, List columns)
+ {
+ List columnArray = new List();
+ Check.Exception(columns.IsNullOrEmpty(), "No columns found ");
+ foreach (var item in columns)
+ {
+ string columnName = item.DbColumnName;
+ string dataSize = "";
+ dataSize = GetSize(item);
+ string dataType = item.DataType;
+ string nullType = item.IsNullable ? this.CreateTableNull : CreateTableNotNull;
+ string primaryKey = null;
+ string identity = item.IsIdentity ? this.CreateTableIdentity : null;
+ string addItem = string.Format(this.CreateTableColumn, this.SqlBuilder.GetTranslationColumnName(columnName), dataType, dataSize, nullType, primaryKey, identity);
+ columnArray.Add(addItem);
+ }
+ string tableString = string.Format(this.CreateTableSql, this.SqlBuilder.GetTranslationTableName(tableName), string.Join(",\r\n", columnArray));
+ return tableString;
+ }
+
+ protected override string GetSize(DbColumnInfo item)
+ {
+ string dataSize = null;
+ var isMax = item.Length > 4000 || item.Length == -1;
+ if (isMax)
+ {
+ dataSize="";
+ item.DataType = "longtext";
+ }
+ else if (item.Length > 0 && item.DecimalDigits == 0)
+ {
+ dataSize = item.Length > 0 ? string.Format("({0})", item.Length) : null;
+ }
+ else if (item.Length == 0 && item.DecimalDigits > 0)
+ {
+ item.Length = 10;
+ dataSize = string.Format("({0},{1})", item.Length, item.DecimalDigits);
+ }
+ else if (item.Length > 0 && item.DecimalDigits > 0)
+ {
+ dataSize = item.Length > 0 ? string.Format("({0},{1})", item.Length, item.DecimalDigits) : null;
+ }
+ return dataSize;
+ }
+
+ public override bool RenameColumn(string tableName, string oldColumnName, string newColumnName)
+ {
+ var columns=GetColumnInfosByTableName(tableName).Where(it=>it.DbColumnName.Equals(oldColumnName,StringComparison.CurrentCultureIgnoreCase));
+ if (columns != null && columns.Any())
+ {
+ var column = columns.First();
+ var appendSql = " " + column.DataType;
+ if (column.Length > 0 && column.Scale == 0)
+ {
+ appendSql += string.Format("({0}) ", column.Length);
+ }
+ else if (column.Scale > 0 && column.Length > 0)
+ {
+ appendSql += string.Format("({0},{1}) ", column.Length, column.Scale);
+ }
+ else
+ {
+ appendSql += column.IsNullable ? " NULL " : " NOT NULL ";
+ }
+ tableName = this.SqlBuilder.GetTranslationTableName(tableName);
+ oldColumnName = this.SqlBuilder.GetTranslationColumnName(oldColumnName);
+ newColumnName = this.SqlBuilder.GetTranslationColumnName(newColumnName);
+ string sql = string.Format(this.RenameColumnSql, tableName, oldColumnName, newColumnName+appendSql);
+ this.Context.Ado.ExecuteCommand(sql);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ public override bool AddDefaultValue(string tableName, string columnName, string defaultValue)
+ {
+ if (defaultValue == "''")
+ {
+ defaultValue = "";
+ }
+ if (defaultValue.ToLower().IsIn("now()", "current_timestamp")|| defaultValue.ToLower().Contains("current_timestamp"))
+ {
+ string template = "ALTER table {0} CHANGE COLUMN {1} {1} {3} default {2}";
+ var dbColumnInfo = this.Context.DbMaintenance.GetColumnInfosByTableName(tableName).First(it => it.DbColumnName.Equals(columnName, StringComparison.CurrentCultureIgnoreCase));
+ string sql = string.Format(template, tableName, columnName, defaultValue, dbColumnInfo.DataType);
+ this.Context.Ado.ExecuteCommand(sql);
+ return true;
+ }
+ else if (defaultValue=="0"|| defaultValue == "1")
+ {
+ string sql = string.Format(AddDefaultValueSql.Replace("'",""), tableName, columnName, defaultValue);
+ this.Context.Ado.ExecuteCommand(sql);
+ return true;
+ }
+ else
+ {
+ return base.AddDefaultValue(tableName, columnName, defaultValue);
+ }
+ }
+ public override bool IsAnyConstraint(string constraintName)
+ {
+ throw new NotSupportedException("MySql IsAnyConstraint NotSupportedException");
+ }
+ public override bool BackupDataBase(string databaseName, string fullFileName)
+ {
+ Check.ThrowNotSupportedException("MySql BackupDataBase NotSupported");
+ return false;
+ }
+
+ #endregion
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/MySqlProvider.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/MySqlProvider.cs
new file mode 100644
index 000000000..29964feb5
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar.MySqlConnectorCore/MySql/MySqlProvider.cs
@@ -0,0 +1,310 @@
+using MySqlConnector;
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Common;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+namespace SqlSugar.MySqlConnectorCore
+{
+ public class MySqlProvider : AdoProvider
+ {
+ public MySqlProvider() { }
+ public override IDbConnection Connection
+ {
+ get
+ {
+ if (base._DbConnection == null)
+ {
+ try
+ {
+ var mySqlConnectionString = base.Context.CurrentConnectionConfig.ConnectionString;
+ if (!mySqlConnectionString.ToLower().Contains("charset"))
+ {
+ mySqlConnectionString = mySqlConnectionString.Trim().TrimEnd(';') + ";charset=utf8;";
+ }
+ base._DbConnection = new MySqlConnection(mySqlConnectionString);
+ }
+ catch (Exception ex)
+ {
+ Check.Exception(true, ex.Message);
+ }
+ }
+ return base._DbConnection;
+ }
+ set
+ {
+ base._DbConnection = value;
+ }
+ }
+
+ public override void BeginTran(string transactionName)
+ {
+ base.BeginTran();
+ }
+ ///
+ /// Only SqlServer
+ ///
+ ///
+ ///
+ public override void BeginTran(IsolationLevel iso, string transactionName)
+ {
+ base.BeginTran(iso);
+ }
+ public override IDataAdapter GetAdapter()
+ {
+ return new MySqlDataAdapter();
+ }
+ public override DbCommand GetCommand(string sql, SugarParameter[] parameters)
+ {
+ MySqlCommand sqlCommand = new MySqlCommand(sql, (MySqlConnection)this.Connection);
+ sqlCommand.CommandType = this.CommandType;
+ sqlCommand.CommandTimeout = this.CommandTimeOut;
+ if (this.Transaction != null)
+ {
+ sqlCommand.Transaction = (MySqlTransaction)this.Transaction;
+ }
+ if (parameters.HasValue())
+ {
+ IDataParameter[] ipars = ToIDbDataParameter(parameters);
+ sqlCommand.Parameters.AddRange((MySqlParameter[])ipars);
+ }
+ CheckConnection();
+ return sqlCommand;
+ }
+ public override void SetCommandToAdapter(IDataAdapter dataAdapter, DbCommand command)
+ {
+ ((MySqlConnectorDataAdapter)dataAdapter).SelectCommand = (MySqlCommand)command;
+ }
+ ///
+ /// if mysql return MySqlParameter[] pars
+ /// if sqlerver return SqlParameter[] pars ...
+ ///
+ ///
+ ///
+ public override IDataParameter[] ToIDbDataParameter(params SugarParameter[] parameters)
+ {
+ if (parameters == null || parameters.Length == 0) return null;
+ MySqlParameter[] result = new MySqlParameter[parameters.Length];
+ int index = 0;
+ var isVarchar =IsVarchar();
+ foreach (var parameter in parameters)
+ {
+ if (parameter.Value == null) parameter.Value = DBNull.Value;
+ var sqlParameter = new MySqlParameter();
+ sqlParameter.ParameterName = parameter.ParameterName;
+ sqlParameter.Size = parameter.Size;
+ sqlParameter.Value = parameter.Value;
+ sqlParameter.DbType = parameter.DbType;
+ if (parameter.Direction == 0)
+ {
+ parameter.Direction = ParameterDirection.Input;
+ }
+ sqlParameter.Direction = parameter.Direction;
+ //if (sqlParameter.Direction == 0)
+ //{
+ // sqlParameter.Direction = ParameterDirection.Input;
+ //}
+ result[index] = sqlParameter;
+ if (sqlParameter.Direction.IsIn(ParameterDirection.Output, ParameterDirection.InputOutput, ParameterDirection.ReturnValue))
+ {
+ if (this.OutputParameters == null) this.OutputParameters = new List();
+ this.OutputParameters.RemoveAll(it => it.ParameterName == sqlParameter.ParameterName);
+ this.OutputParameters.Add(sqlParameter);
+ }
+ if (isVarchar && sqlParameter.DbType == System.Data.DbType.String)
+ {
+ sqlParameter.DbType = System.Data.DbType.AnsiString;
+ }
+ else if (parameter.DbType== System.Data.DbType.DateTimeOffset)
+ {
+ if(sqlParameter.Value != DBNull.Value)
+ sqlParameter.Value = UtilMethods.ConvertFromDateTimeOffset((DateTimeOffset)sqlParameter.Value);
+ sqlParameter.DbType = System.Data.DbType.DateTime;
+ }
+ ++index;
+ }
+ return result;
+ }
+
+ private bool IsVarchar()
+ {
+ if (this.Context.CurrentConnectionConfig.MoreSettings != null && this.Context.CurrentConnectionConfig.MoreSettings.DisableNvarchar)
+ {
+ return true;
+ }
+ return false;
+ }
+
+
+ #region async
+ public async Task CloseAsync()
+ {
+ if (this.Transaction != null)
+ {
+ this.Transaction = null;
+ }
+ if (this.Connection != null && this.Connection.State == ConnectionState.Open)
+ {
+ await (this.Connection as MySqlConnection).CloseAsync();
+ }
+ if (this.IsMasterSlaveSeparation && this.SlaveConnections.HasValue())
+ {
+ foreach (var slaveConnection in this.SlaveConnections)
+ {
+ if (slaveConnection != null && slaveConnection.State == ConnectionState.Open)
+ {
+ await (slaveConnection as MySqlConnection).CloseAsync();
+ }
+ }
+ }
+ }
+ public async Task GetCommandAsync(string sql, SugarParameter[] parameters)
+ {
+ MySqlCommand sqlCommand = new MySqlCommand(sql, (MySqlConnection)this.Connection);
+ sqlCommand.CommandType = this.CommandType;
+ sqlCommand.CommandTimeout = this.CommandTimeOut;
+ if (this.Transaction != null)
+ {
+ sqlCommand.Transaction = (MySqlTransaction)this.Transaction;
+ }
+ if (parameters.HasValue())
+ {
+ IDataParameter[] ipars = ToIDbDataParameter(parameters);
+ sqlCommand.Parameters.AddRange((MySqlParameter[])ipars);
+ }
+ if (this.Connection.State != ConnectionState.Open)
+ {
+ try
+ {
+ await (this.Connection as MySqlConnection).OpenAsync();
+ }
+ catch (Exception ex)
+ {
+ Check.Exception(true, ex.Message);
+ }
+ }
+ return sqlCommand;
+ }
+ public override async Task ExecuteCommandAsync(string sql, params SugarParameter[] parameters)
+ {
+ try
+ {
+ Async();
+ InitParameters(ref sql, parameters);
+ if (FormatSql != null)
+ sql = FormatSql(sql);
+ SetConnectionStart(sql);
+ if (this.ProcessingEventStartingSQL != null)
+ ExecuteProcessingSQL(ref sql, parameters);
+ ExecuteBefore(sql, parameters);
+ var sqlCommand =await GetCommandAsync(sql, parameters);
+ int count;
+ if (this.CancellationToken == null)
+ count = await sqlCommand.ExecuteNonQueryAsync();
+ else
+ count = await sqlCommand.ExecuteNonQueryAsync(this.CancellationToken.Value);
+ if (this.IsClearParameters)
+ sqlCommand.Parameters.Clear();
+ ExecuteAfter(sql, parameters);
+ sqlCommand.Dispose();
+ return count;
+ }
+ catch (Exception ex)
+ {
+ CommandType = CommandType.Text;
+ if (ErrorEvent != null)
+ ExecuteErrorEvent(sql, parameters, ex);
+ throw ex;
+ }
+ finally
+ {
+ if (this.IsAutoClose())
+ {
+ await this.CloseAsync();
+ }
+ SetConnectionEnd(sql);
+ }
+ }
+ public override async Task GetDataReaderAsync(string sql, params SugarParameter[] parameters)
+ {
+ try
+ {
+ Async();
+ InitParameters(ref sql, parameters);
+ if (FormatSql != null)
+ sql = FormatSql(sql);
+ SetConnectionStart(sql);
+ var isSp = this.CommandType == CommandType.StoredProcedure;
+ if (this.ProcessingEventStartingSQL != null)
+ ExecuteProcessingSQL(ref sql, parameters);
+ ExecuteBefore(sql, parameters);
+ var sqlCommand = await GetCommandAsync(sql, parameters);
+ DbDataReader sqlDataReader;
+ if (this.CancellationToken == null)
+ sqlDataReader = await sqlCommand.ExecuteReaderAsync(this.IsAutoClose() ? CommandBehavior.CloseConnection : CommandBehavior.Default);
+ else
+ sqlDataReader = await sqlCommand.ExecuteReaderAsync(this.IsAutoClose() ? CommandBehavior.CloseConnection : CommandBehavior.Default, this.CancellationToken.Value);
+ if (isSp)
+ DataReaderParameters = sqlCommand.Parameters;
+ if (this.IsClearParameters)
+ sqlCommand.Parameters.Clear();
+ ExecuteAfter(sql, parameters);
+ SetConnectionEnd(sql);
+ if (SugarCompatible.IsFramework || this.Context.CurrentConnectionConfig.DbType != DbType.Sqlite)
+ sqlCommand.Dispose();
+ return sqlDataReader;
+ }
+ catch (Exception ex)
+ {
+ CommandType = CommandType.Text;
+ if (ErrorEvent != null)
+ ExecuteErrorEvent(sql, parameters, ex);
+ throw ex;
+ }
+ }
+ public override async Task