From 994cc475c214d0e376c5e78416f751d7ce9e33db Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Sat, 11 Jan 2020 02:22:16 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E8=A7=A3=E5=86=B3=20=E8=A1=A8=E5=90=8D?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=8C=85=E5=90=AB=E7=82=B9=EF=BC=8C=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E8=BF=9B=E8=A1=8C=20CRUD=20=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=E7=94=B1=E4=BA=8E=E6=B5=8B=E8=AF=95=E7=9A=84?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E6=80=A7=EF=BC=8C=E6=AD=A4=E7=B1=BB=E6=83=85?= =?UTF-8?q?=E5=86=B5=E4=BB=85=E6=94=AF=E6=8C=81=20MySql/Sqlite=20CodeFirst?= =?UTF-8?q?=20=E8=87=AA=E5=8A=A8=E8=BF=81=E7=A7=BB=EF=BC=9B=20>=20?= =?UTF-8?q?=E6=B3=A8=E6=84=8F=EF=BC=9A=E5=B0=BD=E9=87=8F=E4=B8=8D=E8=A6=81?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=B8=A6=E7=82=B9=E7=9A=84=E8=A1=A8=E5=90=8D?= =?UTF-8?q?=EF=BC=8C=E5=8F=AA=E6=9C=89=20MySql/Sqlite=20=E5=AF=B9=E6=AD=A4?= =?UTF-8?q?=E7=B1=BB=E8=A1=A8=E5=90=8D=E6=94=AF=E6=8C=81=20CodeFirst?= =?UTF-8?q?=E3=80=82=E4=BD=86=E6=98=AF=E5=AE=83=E4=B8=8D=E5=BD=B1=E5=93=8D?= =?UTF-8?q?=20CRUD=20=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BD=BF=E7=94=A8=20[Tabl?= =?UTF-8?q?e(Name=20=3D=20"`sys.config`")]=20=E8=A7=A3=E5=86=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Extensions/FreeSql.Generator/RazorModel.cs | 8 +- .../MySqlConnector/MySqlCodeFirstTest.cs | 27 +++++++ .../MySql/MySqlCodeFirstTest.cs | 27 +++++++ .../FreeSql.Tests/Internal/CommonUtilsTest.cs | 78 +++++++++++++++++++ .../FreeSql.Tests/MySql/MySqlCodeFirstTest.cs | 28 +++++++ .../Sqlite/SqliteCodeFirstTest.cs | 28 +++++++ FreeSql/Internal/CommonUtils.cs | 17 +++- .../Curd/MsAccessDelete.cs | 2 +- .../MsAccessUtils.cs | 20 +++-- .../FreeSql.Provider.MySql/MySqlCodeFirst.cs | 34 ++++---- .../FreeSql.Provider.MySql/MySqlUtils.cs | 21 ++--- .../MySqlConnectorUtils.cs | 21 ++--- .../Dameng/OdbcDamengCodeFirst.cs | 7 +- .../Dameng/OdbcDamengUtils.cs | 19 +++-- .../Default/OdbcUtils.cs | 22 +++--- .../GBase/__OdbcGBaseCodeFirst.cs | 7 +- .../GBase/__OdbcGBaseUtils.cs | 34 ++++---- .../MySql/OdbcMySqlCodeFirst.cs | 28 +++---- .../MySql/OdbcMySqlUtils.cs | 21 ++--- .../Oracle/OdbcOracleCodeFirst.cs | 7 +- .../Oracle/OdbcOracleUtils.cs | 19 +++-- .../PostgreSQL/OdbcPostgreSQLCodeFirst.cs | 7 +- .../PostgreSQL/OdbcPostgreSQLUtils.cs | 34 ++++---- .../SqlServer/OdbcSqlServerCodeFirst.cs | 7 +- .../SqlServer/OdbcSqlServerUtils.cs | 20 +++-- .../OracleCodeFirst.cs | 7 +- .../FreeSql.Provider.Oracle/OracleUtils.cs | 19 +++-- .../PostgreSQLCodeFirst.cs | 12 ++- .../PostgreSQLUtils.cs | 23 +++--- .../SqlServerCodeFirst.cs | 13 ++-- .../SqlServerUtils.cs | 19 +++-- .../SqliteCodeFirst.cs | 26 +++---- .../FreeSql.Provider.Sqlite/SqliteUtils.cs | 19 +++-- 33 files changed, 467 insertions(+), 214 deletions(-) create mode 100644 FreeSql.Tests/FreeSql.Tests/Internal/CommonUtilsTest.cs diff --git a/Extensions/FreeSql.Generator/RazorModel.cs b/Extensions/FreeSql.Generator/RazorModel.cs index d754ee2f..7a8dbdb9 100644 --- a/Extensions/FreeSql.Generator/RazorModel.cs +++ b/Extensions/FreeSql.Generator/RazorModel.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; -using System.Threading.Tasks; public class RazorModel { public RazorModel(IFreeSql fsql, string nameSpace, bool[] NameOptions, List tables, DbTableInfo table) { @@ -55,7 +54,12 @@ public class RazorModel { var sb = new List(); if (GetCsName(this.FullTableName) != this.FullTableName) - sb.Add("Name = \"" + this.FullTableName + "\""); + { + if (this.FullTableName.IndexOf('.') == -1) + sb.Add("Name = \"" + this.FullTableName + "\""); + else + sb.Add("Name = \"" + this.FullTableName + "\""); //Todo: QuoteSqlName + } if (sb.Any() == false) return null; return "[Table(" + string.Join(", ", sb) + ")]"; diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlCodeFirstTest.cs index 2895bf7f..7f174fd9 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlCodeFirstTest.cs @@ -10,6 +10,33 @@ namespace FreeSql.Tests.MySqlConnector { public class MySqlCodeFirstTest { + [Fact] + public void 表名中有点() + { + var item = new tbdot01 { name = "insert" }; + g.mysql.Insert(item).ExecuteAffrows(); + + var find = g.mysql.Select().Where(a => a.id == item.id).First(); + Assert.NotNull(find); + Assert.Equal(item.id, find.id); + Assert.Equal("insert", find.name); + + Assert.Equal(1, g.mysql.Update().Set(a => a.name == "update").Where(a => a.id == item.id).ExecuteAffrows()); + find = g.mysql.Select().Where(a => a.id == item.id).First(); + Assert.NotNull(find); + Assert.Equal(item.id, find.id); + Assert.Equal("update", find.name); + + Assert.Equal(1, g.mysql.Delete().Where(a => a.id == item.id).ExecuteAffrows()); + find = g.mysql.Select().Where(a => a.id == item.id).First(); + Assert.Null(find); + } + [Table(Name = "`sys.tbdot01`")] + class tbdot01 + { + public Guid id { get; set; } + public string name { get; set; } + } [Fact] public void 中文表_字段() diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlCodeFirstTest.cs index e28cb85f..d06c3a27 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlCodeFirstTest.cs @@ -10,6 +10,33 @@ namespace FreeSql.Tests.Odbc.MySql { public class MySqlCodeFirstTest { + [Fact] + public void 表名中有点() + { + var item = new tbdot01 { name = "insert" }; + g.mysql.Insert(item).ExecuteAffrows(); + + var find = g.mysql.Select().Where(a => a.id == item.id).First(); + Assert.NotNull(find); + Assert.Equal(item.id, find.id); + Assert.Equal("insert", find.name); + + Assert.Equal(1, g.mysql.Update().Set(a => a.name == "update").Where(a => a.id == item.id).ExecuteAffrows()); + find = g.mysql.Select().Where(a => a.id == item.id).First(); + Assert.NotNull(find); + Assert.Equal(item.id, find.id); + Assert.Equal("update", find.name); + + Assert.Equal(1, g.mysql.Delete().Where(a => a.id == item.id).ExecuteAffrows()); + find = g.mysql.Select().Where(a => a.id == item.id).First(); + Assert.Null(find); + } + [Table(Name = "`sys.tbdot01`")] + class tbdot01 + { + public Guid id { get; set; } + public string name { get; set; } + } [Fact] public void 中文表_字段() diff --git a/FreeSql.Tests/FreeSql.Tests/Internal/CommonUtilsTest.cs b/FreeSql.Tests/FreeSql.Tests/Internal/CommonUtilsTest.cs new file mode 100644 index 00000000..ffa21679 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/Internal/CommonUtilsTest.cs @@ -0,0 +1,78 @@ +锘縰sing FreeSql.DataAnnotations; +using FreeSql; +using System; +using System.Collections.Generic; +using Xunit; +using System.Linq; +using Newtonsoft.Json.Linq; +using NpgsqlTypes; +using Npgsql.LegacyPostgis; +using System.Linq.Expressions; +using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations; +using System.Threading; +using System.Data.SqlClient; +using kwlib; +using System.Diagnostics; +using System.IO; +using System.Text; +using FreeSql.Internal; + +namespace FreeSql.InternalTests +{ + public class CommonUtilsTest + { + + [Fact] + public void GetSplitTableNames() + { + var tbname = CommonUtils.GetSplitTableNames("table1", '`', '`', 2); + Assert.Equal("table1", tbname[0]); + + tbname = CommonUtils.GetSplitTableNames("table1", '"', '"', 2); + Assert.Equal("table1", tbname[0]); + + tbname = CommonUtils.GetSplitTableNames("table1", '[', ']', 2); + Assert.Equal("table1", tbname[0]); + + //--- + + tbname = CommonUtils.GetSplitTableNames("schema1.table1", '`', '`', 2); + Assert.Equal("schema1", tbname[0]); + Assert.Equal("table1", tbname[1]); + + tbname = CommonUtils.GetSplitTableNames("schema1.table1", '"', '"', 2); + Assert.Equal("schema1", tbname[0]); + Assert.Equal("table1", tbname[1]); + + tbname = CommonUtils.GetSplitTableNames("schema1.table1", '[', ']', 2); + Assert.Equal("schema1", tbname[0]); + Assert.Equal("table1", tbname[1]); + + //--- + + tbname = CommonUtils.GetSplitTableNames("`sys.table1`", '`', '`', 2); + Assert.Equal("sys.table1", tbname[0]); + + tbname = CommonUtils.GetSplitTableNames("\"sys.table1\"", '"', '"', 2); + Assert.Equal("sys.table1", tbname[0]); + + tbname = CommonUtils.GetSplitTableNames("[sys.table1]", '[', ']', 2); + Assert.Equal("sys.table1", tbname[0]); + + //--- + + tbname = CommonUtils.GetSplitTableNames("`schema1`.`sys.table1`", '`', '`', 2); + Assert.Equal("schema1", tbname[0]); + Assert.Equal("sys.table1", tbname[1]); + + tbname = CommonUtils.GetSplitTableNames("\"schema1\".\"sys.table1\"", '"', '"', 2); + Assert.Equal("schema1", tbname[0]); + Assert.Equal("sys.table1", tbname[1]); + + tbname = CommonUtils.GetSplitTableNames("[schema1].[sys.table1]", '[', ']', 2); + Assert.Equal("schema1", tbname[0]); + Assert.Equal("sys.table1", tbname[1]); + } + } +} diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs index 193d27ee..f98d084c 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs @@ -11,6 +11,34 @@ namespace FreeSql.Tests.MySql public class MySqlCodeFirstTest { + [Fact] + public void 表名中有点() + { + var item = new tbdot01 { name = "insert" }; + g.mysql.Insert(item).ExecuteAffrows(); + + var find = g.mysql.Select().Where(a => a.id == item.id).First(); + Assert.NotNull(find); + Assert.Equal(item.id, find.id); + Assert.Equal("insert", find.name); + + Assert.Equal(1, g.mysql.Update().Set(a => a.name == "update").Where(a => a.id == item.id).ExecuteAffrows()); + find = g.mysql.Select().Where(a => a.id == item.id).First(); + Assert.NotNull(find); + Assert.Equal(item.id, find.id); + Assert.Equal("update", find.name); + + Assert.Equal(1, g.mysql.Delete().Where(a => a.id == item.id).ExecuteAffrows()); + find = g.mysql.Select().Where(a => a.id == item.id).First(); + Assert.Null(find); + } + [Table(Name = "`sys.tbdot01`")] + class tbdot01 + { + public Guid id { get; set; } + public string name { get; set; } + } + [Fact] public void 中文表_字段() { diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs index fb9e02ec..9eb09d80 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs @@ -11,6 +11,34 @@ namespace FreeSql.Tests.Sqlite public class SqliteCodeFirstTest { + [Fact] + public void 表名中有点() + { + var item = new tbdot01 { name = "insert" }; + g.sqlite.Insert(item).ExecuteAffrows(); + + var find = g.sqlite.Select().Where(a => a.id == item.id).First(); + Assert.NotNull(find); + Assert.Equal(item.id, find.id); + Assert.Equal("insert", find.name); + + Assert.Equal(1, g.sqlite.Update().Set(a => a.name == "update").Where(a => a.id == item.id).ExecuteAffrows()); + find = g.sqlite.Select().Where(a => a.id == item.id).First(); + Assert.NotNull(find); + Assert.Equal(item.id, find.id); + Assert.Equal("update", find.name); + + Assert.Equal(1, g.sqlite.Delete().Where(a => a.id == item.id).ExecuteAffrows()); + find = g.sqlite.Select().Where(a => a.id == item.id).First(); + Assert.Null(find); + } + [Table(Name = "\"sys.tbdot01\"")] + class tbdot01 + { + public Guid id { get; set; } + public string name { get; set; } + } + [Fact] public void 中文表_字段() { diff --git a/FreeSql/Internal/CommonUtils.cs b/FreeSql/Internal/CommonUtils.cs index 4096acda..f695b8aa 100644 --- a/FreeSql/Internal/CommonUtils.cs +++ b/FreeSql/Internal/CommonUtils.cs @@ -27,8 +27,23 @@ namespace FreeSql.Internal public abstract DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value); public abstract DbParameter[] GetDbParamtersByObject(string sql, object obj); public abstract string FormatSql(string sql, params object[] args); - public abstract string QuoteSqlName(string name); + public abstract string QuoteSqlName(params string[] name); public abstract string TrimQuoteSqlName(string name); + public abstract string[] SplitTableName(string name); + public static string[] GetSplitTableNames(string name, char leftQuote, char rightQuote, int size) + { + if (string.IsNullOrEmpty(name)) return null; + if (name.IndexOf(leftQuote) == -1) return name.Split(new[] { '.' }, size); + name = Regex.Replace(name, + (leftQuote == '[' ? "\\" : "") + + leftQuote + @"([^" + (rightQuote == ']' ? "\\" : "") + rightQuote + @"]+)" + + (rightQuote == ']' ? "\\" : "") + + rightQuote, m => m.Groups[1].Value.Replace('.', '?')); + var ret = name.Split(new[] { '.' }, size); + for (var a = 0; a < ret.Length; a++) + ret[a] = ret[a].Replace('?', '.'); + return ret; + } public abstract string QuoteParamterName(string name); public abstract string IsNull(string sql, object value); public abstract string StringConcat(string[] objs, Type[] types); diff --git a/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessDelete.cs b/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessDelete.cs index 31e2c19e..7990aae6 100644 --- a/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessDelete.cs +++ b/Providers/FreeSql.Provider.MsAccess/Curd/MsAccessDelete.cs @@ -22,7 +22,7 @@ namespace FreeSql.MsAccess.Curd #if net40 #else - async public override Task> ExecuteDeletedAsync() + public override Task> ExecuteDeletedAsync() { throw new NotImplementedException(); } diff --git a/Providers/FreeSql.Provider.MsAccess/MsAccessUtils.cs b/Providers/FreeSql.Provider.MsAccess/MsAccessUtils.cs index cc5d50ee..31c9b7a1 100644 --- a/Providers/FreeSql.Provider.MsAccess/MsAccessUtils.cs +++ b/Providers/FreeSql.Provider.MsAccess/MsAccessUtils.cs @@ -2,11 +2,8 @@ using FreeSql.Internal.Model; using System; using System.Collections.Generic; -using System.Data; using System.Data.Common; using System.Data.OleDb; -using System.Linq; -using System.Linq.Expressions; using System.Text; namespace FreeSql.MsAccess @@ -40,12 +37,18 @@ namespace FreeSql.MsAccess }); public override string FormatSql(string sql, params object[] args) => sql?.FormatAccess(args); - public override string QuoteSqlName(string name) + public override string QuoteSqlName(params string[] name) { - var nametrim = name.Trim(); - if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) - return nametrim; //鍘熺敓SQL - return $"[{nametrim.TrimStart('[').TrimEnd(']').Replace(".", "].[")}]"; + if (name.Length == 1) + { + var nametrim = name[0].Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //鍘熺敓SQL + if (nametrim.StartsWith("[") && nametrim.EndsWith("]")) + return nametrim; + return $"[{nametrim.Replace(".", "].[")}]"; + } + return $"[{string.Join("].[", name)}]"; } public override string TrimQuoteSqlName(string name) { @@ -54,6 +57,7 @@ namespace FreeSql.MsAccess return nametrim; //鍘熺敓SQL return $"{nametrim.TrimStart('[').TrimEnd(']').Replace("].[", ".").Replace(".[", ".")}"; } + public override string[] SplitTableName(string name) => GetSplitTableNames(name, '[', ']', 2); public override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; public override string IsNull(string sql, object value) => $"iif(isnull({sql}), {value}, {sql})"; public override string StringConcat(string[] objs, Type[] types) diff --git a/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs b/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs index b942a2b4..6cf5089d 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs @@ -1,10 +1,6 @@ -锘縰sing FreeSql.DataAnnotations; -using FreeSql.DatabaseModel; -using FreeSql.Internal; -using FreeSql.Internal.Model; +锘縰sing FreeSql.Internal; using MySql.Data.MySqlClient; using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.Data; using System.Linq; @@ -112,14 +108,14 @@ namespace FreeSql.MySql var tb = _commonUtils.GetTableByEntity(obj.entityType); if (tb == null) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ"); if (tb.Columns.Any() == false) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ锛屽彲杩佺Щ灞炴0涓"); - var tbname = tb.DbName.Split(new[] { '.' }, 2); + var tbname = _commonUtils.SplitTableName(tb.DbName); if (tbname?.Length == 1) tbname = new[] { database, tbname[0] }; - var tboldname = tb.DbOldName?.Split(new[] { '.' }, 2); //鏃ц〃鍚 + var tboldname = _commonUtils.SplitTableName(tb.DbOldName); //鏃ц〃鍚 if (tboldname?.Length == 1) tboldname = new[] { database, tboldname[0] }; if (string.IsNullOrEmpty(obj.tableName) == false) { - var tbtmpname = obj.tableName.Split(new[] { '.' }, 2); + var tbtmpname = _commonUtils.SplitTableName(obj.tableName); if (tbtmpname?.Length == 1) tbtmpname = new[] { database, tbtmpname[0] }; if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) { @@ -145,7 +141,7 @@ namespace FreeSql.MySql if (tboldname == null) { //鍒涘缓琛 - var createTableName = _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}"); + var createTableName = _commonUtils.QuoteSqlName(tbname[0], tbname[1]); sb.Append("CREATE TABLE IF NOT EXISTS ").Append(createTableName).Append(" ( "); foreach (var tbcol in tb.ColumnsByPosition) { @@ -180,7 +176,7 @@ namespace FreeSql.MySql } //濡傛灉鏂拌〃锛屾棫琛ㄥ湪涓涓暟鎹簱涓嬶紝鐩存帴淇敼琛ㄥ悕 if (string.Compare(tbname[0], tboldname[0], true) == 0) - sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}")).Append(" RENAME TO ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(";\r\n"); + sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName(tboldname[0], tboldname[1])).Append(" RENAME TO ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1])).Append(";\r\n"); else { //濡傛灉鏂拌〃锛屾棫琛ㄤ笉鍦ㄤ竴璧凤紝鍒涘缓鏂拌〃锛屽鍏ユ暟鎹紝鍒犻櫎鏃ц〃 @@ -237,8 +233,8 @@ where a.table_schema in ({0}) and a.table_name in ({1})", tboldname ?? tbname); isCommentChanged) { if (tbcol.Attribute.IsNullable != tbstructcol.is_nullable && tbcol.Attribute.IsNullable == false && tbcol.DbDefaultValue != "NULL" && tbcol.Attribute.IsIdentity == false) - sbalter.Append("UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" = ").Append(tbcol.DbDefaultValue).Append(" WHERE ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" IS NULL;\r\n"); - sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" MODIFY ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" ").Append(tbcol.Attribute.DbType); + sbalter.Append("UPDATE ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1])).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" = ").Append(tbcol.DbDefaultValue).Append(" WHERE ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" IS NULL;\r\n"); + sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1])).Append(" MODIFY ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" ").Append(tbcol.Attribute.DbType); if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append(" COMMENT ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "")); if (tbcol.Attribute.IsIdentity == true && tbcol.Attribute.DbType.IndexOf("AUTO_INCREMENT", StringComparison.CurrentCultureIgnoreCase) == -1) sbalter.Append(" AUTO_INCREMENT"); if (tbcol.Attribute.IsIdentity == true) sbalter.Append(existsPrimary == null ? "" : ", DROP PRIMARY KEY").Append(", ADD PRIMARY KEY(").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(")"); @@ -247,7 +243,7 @@ where a.table_schema in ({0}) and a.table_name in ({1})", tboldname ?? tbname); if (string.Compare(tbstructcol.column, tbcol.Attribute.OldName, true) == 0) { //淇敼鍒楀悕 - sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" CHANGE COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType); + sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1])).Append(" CHANGE COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType); if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append(" COMMENT ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "")); if (tbcol.Attribute.IsIdentity == true && tbcol.Attribute.DbType.IndexOf("AUTO_INCREMENT", StringComparison.CurrentCultureIgnoreCase) == -1) sbalter.Append(" AUTO_INCREMENT"); if (tbcol.Attribute.IsIdentity == true) sbalter.Append(existsPrimary == null ? "" : ", DROP PRIMARY KEY").Append(", ADD PRIMARY KEY(").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(")"); @@ -256,7 +252,7 @@ where a.table_schema in ({0}) and a.table_name in ({1})", tboldname ?? tbname); continue; } //娣诲姞鍒 - sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ADD ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType); + sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1])).Append(" ADD ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType); if (tbcol.Attribute.IsNullable == false && tbcol.DbDefaultValue != "NULL" && tbcol.Attribute.IsIdentity == false) sbalter.Append(" DEFAULT ").Append(tbcol.DbDefaultValue); if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append(" COMMENT ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "")); if (tbcol.Attribute.IsIdentity == true && tbcol.Attribute.DbType.IndexOf("AUTO_INCREMENT", StringComparison.CurrentCultureIgnoreCase) == -1) sbalter.Append(" AUTO_INCREMENT"); @@ -278,10 +274,10 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI var dsukfind1 = dsuk.Where(a => string.Compare(a[1], uk.Name, true) == 0).ToArray(); if (dsukfind1.Any() == false || dsukfind1.Length != uk.Columns.Length || dsukfind1.Where(a => (a[3] == "1") == uk.IsUnique && uk.Columns.Where(b => string.Compare(b.Column.Attribute.Name, a[0], true) == 0 && (a[2] == "1") == b.IsDesc).Any()).Count() != uk.Columns.Length) { - if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(";\r\n"); + if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1])).Append(";\r\n"); sbalter.Append("CREATE "); if (uk.IsUnique) sbalter.Append("UNIQUE "); - sbalter.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append("("); + sbalter.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1])).Append("("); foreach (var tbcol in uk.Columns) { sbalter.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); @@ -299,8 +295,8 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI } //鍒涘缓涓存椂琛紝鏁版嵁瀵艰繘涓存椂琛紝鐒跺悗鍒犻櫎鍘熻〃锛屽皢涓存椂琛ㄦ敼鍚嶄负鍘熻〃鍚 - var tablename = tboldname == null ? _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}") : _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}"); - var tmptablename = _commonUtils.QuoteSqlName($"{tbname[0]}.FreeSqlTmp_{tbname[1]}"); + var tablename = tboldname == null ? _commonUtils.QuoteSqlName(tbname[0], tbname[1]) : _commonUtils.QuoteSqlName(tboldname[0], tboldname[1]); + var tmptablename = _commonUtils.QuoteSqlName(tbname[0], $"FreeSqlTmp_{tbname[1]}"); //鍒涘缓涓存椂琛 sb.Append("CREATE TABLE IF NOT EXISTS ").Append(tmptablename).Append(" ( "); foreach (var tbcol in tb.ColumnsByPosition) @@ -343,7 +339,7 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI } sb.Remove(sb.Length - 2, 2).Append(" FROM ").Append(tablename).Append(";\r\n"); sb.Append("DROP TABLE ").Append(tablename).Append(";\r\n"); - sb.Append("ALTER TABLE ").Append(tmptablename).Append(" RENAME TO ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(";\r\n"); + sb.Append("ALTER TABLE ").Append(tmptablename).Append(" RENAME TO ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1])).Append(";\r\n"); //鍒涘缓琛ㄧ殑绱㈠紩 foreach (var uk in tb.Indexes) { diff --git a/Providers/FreeSql.Provider.MySql/MySqlUtils.cs b/Providers/FreeSql.Provider.MySql/MySqlUtils.cs index 3e97a404..3da98012 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlUtils.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlUtils.cs @@ -4,10 +4,6 @@ using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using System.Data.Common; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using System.Text; namespace FreeSql.MySql { @@ -69,12 +65,18 @@ namespace FreeSql.MySql }); public override string FormatSql(string sql, params object[] args) => sql?.FormatMySql(args); - public override string QuoteSqlName(string name) + public override string QuoteSqlName(params string[] name) { - var nametrim = name.Trim(); - if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) - return nametrim; //鍘熺敓SQL - return $"`{nametrim.Trim('`').Replace(".", "`.`")}`"; + if (name.Length == 1) + { + var nametrim = name[0].Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //鍘熺敓SQL + if (nametrim.StartsWith("`") && nametrim.EndsWith("`")) + return nametrim; + return $"`{nametrim.Replace(".", "`.`")}`"; + } + return $"`{string.Join("`.`", name)}`"; } public override string TrimQuoteSqlName(string name) { @@ -83,6 +85,7 @@ namespace FreeSql.MySql return nametrim; //鍘熺敓SQL return $"{nametrim.Trim('`').Replace("`.`", ".").Replace(".`", ".")}"; } + public override string[] SplitTableName(string name) => GetSplitTableNames(name, '`', '`', 2); public override string QuoteParamterName(string name) => $"?{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})"; public override string StringConcat(string[] objs, Type[] types) => $"concat({string.Join(", ", objs)})"; diff --git a/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs b/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs index 0f1f122a..8541261f 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs +++ b/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs @@ -4,10 +4,6 @@ using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using System.Data.Common; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using System.Text; namespace FreeSql.MySql { @@ -77,12 +73,18 @@ namespace FreeSql.MySql }); public override string FormatSql(string sql, params object[] args) => sql?.FormatMySql(args); - public override string QuoteSqlName(string name) + public override string QuoteSqlName(params string[] name) { - var nametrim = name.Trim(); - if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) - return nametrim; //鍘熺敓SQL - return $"`{nametrim.Trim('`').Replace(".", "`.`")}`"; + if (name.Length == 1) + { + var nametrim = name[0].Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //鍘熺敓SQL + if (nametrim.StartsWith("`") && nametrim.EndsWith("`")) + return nametrim; + return $"`{nametrim.Replace(".", "`.`")}`"; + } + return $"`{string.Join("`.`", name)}`"; } public override string TrimQuoteSqlName(string name) { @@ -91,6 +93,7 @@ namespace FreeSql.MySql return nametrim; //鍘熺敓SQL return $"{nametrim.Trim('`').Replace("`.`", ".").Replace(".`", ".")}"; } + public override string[] SplitTableName(string name) => GetSplitTableNames(name, '`', '`', 2); public override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})"; public override string StringConcat(string[] objs, Type[] types) => $"concat({string.Join(", ", objs)})"; diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengCodeFirst.cs index f9e6d7d0..0522f9c2 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengCodeFirst.cs @@ -94,15 +94,15 @@ namespace FreeSql.Odbc.Dameng var tb = _commonUtils.GetTableByEntity(obj.entityType); if (tb == null) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ"); if (tb.Columns.Any() == false) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ锛屽彲杩佺Щ灞炴0涓"); - var tbname = tb.DbName.Split(new[] { '.' }, 2); + var tbname = _commonUtils.SplitTableName(tb.DbName); if (tbname?.Length == 1) tbname = new[] { userId, tbname[0] }; - var tboldname = tb.DbOldName?.Split(new[] { '.' }, 2); //鏃ц〃鍚 + var tboldname = _commonUtils.SplitTableName(tb.DbOldName); //鏃ц〃鍚 if (tboldname?.Length == 1) tboldname = new[] { userId, tboldname[0] }; var primaryKeyName = (obj.entityType.GetCustomAttributes(typeof(OraclePrimaryKeyNameAttribute), false)?.FirstOrDefault() as OraclePrimaryKeyNameAttribute)?.Name; if (string.IsNullOrEmpty(obj.tableName) == false) { - var tbtmpname = obj.tableName.Split(new[] { '.' }, 2); + var tbtmpname = _commonUtils.SplitTableName(obj.tableName); if (tbtmpname?.Length == 1) tbtmpname = new[] { userId, tbtmpname[0] }; if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) { @@ -111,6 +111,7 @@ namespace FreeSql.Odbc.Dameng primaryKeyName = null; } } + //codefirst 涓嶆敮鎸佽〃鍚嶄腑甯 . if (string.Compare(tbname[0], userId) != 0 && _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(" select 1 from sys.dba_users where username={0}", tbname[0])) == null) //鍒涘缓鏁版嵁搴 throw new NotImplementedException($"Oracle CodeFirst 涓嶆敮鎸佷唬鐮佸垱寤 tablespace 涓 schemas {tbname[0]}"); diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengUtils.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengUtils.cs index 0a407b2a..1bfc029b 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengUtils.cs @@ -4,8 +4,6 @@ using System; using System.Collections.Generic; using System.Data.Common; using System.Data.Odbc; -using System.Linq.Expressions; -using System.Text; namespace FreeSql.Odbc.Dameng { @@ -68,12 +66,18 @@ namespace FreeSql.Odbc.Dameng }); public override string FormatSql(string sql, params object[] args) => sql?.FormatOdbcOracle(args); - public override string QuoteSqlName(string name) + public override string QuoteSqlName(params string[] name) { - var nametrim = name.Trim(); - if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) - return nametrim; //鍘熺敓SQL - return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; + if (name.Length == 1) + { + var nametrim = name[0].Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //鍘熺敓SQL + if (nametrim.StartsWith("\"") && nametrim.EndsWith("\"")) + return nametrim; + return $"\"{nametrim.Replace(".", "\".\"")}\""; + } + return $"\"{string.Join("\".\"", name)}\""; } public override string TrimQuoteSqlName(string name) { @@ -82,6 +86,7 @@ namespace FreeSql.Odbc.Dameng return nametrim; //鍘熺敓SQL return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; } + public override string[] SplitTableName(string name) => GetSplitTableNames(name, '"', '"', 2); public override string QuoteParamterName(string name) => $":{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; public override string IsNull(string sql, object value) => $"nvl({sql}, {value})"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcUtils.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcUtils.cs index ba0937b5..c3a64399 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcUtils.cs @@ -2,12 +2,8 @@ using FreeSql.Internal.Model; using System; using System.Collections.Generic; -using System.Data; using System.Data.Common; using System.Data.Odbc; -using System.Linq; -using System.Linq.Expressions; -using System.Text; namespace FreeSql.Odbc.Default { @@ -39,13 +35,18 @@ namespace FreeSql.Odbc.Default }); public override string FormatSql(string sql, params object[] args) => sql?.FormatOdbc(args); - public override string QuoteSqlName(string name) + public override string QuoteSqlName(params string[] name) { - var nametrim = name.Trim(); - if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) - return nametrim; //鍘熺敓SQL - //return $"[{nametrim.TrimStart('[').TrimEnd(']').Replace(".", "].[")}]"; - return $"{Adapter.QuoteSqlNameLeft}{nametrim.TrimStart(Adapter.QuoteSqlNameLeft).TrimEnd(Adapter.QuoteSqlNameRight).Replace(".", $"{Adapter.QuoteSqlNameRight}.{Adapter.QuoteSqlNameLeft}")}{Adapter.QuoteSqlNameRight}"; + if (name.Length == 1) + { + var nametrim = name[0].Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //鍘熺敓SQL + if (nametrim.StartsWith(Adapter.QuoteSqlNameLeft.ToString()) && nametrim.EndsWith(Adapter.QuoteSqlNameRight.ToString())) + return nametrim; + return $"{Adapter.QuoteSqlNameLeft}{nametrim.TrimStart(Adapter.QuoteSqlNameLeft).TrimEnd(Adapter.QuoteSqlNameRight).Replace(".", $"{Adapter.QuoteSqlNameRight}.{Adapter.QuoteSqlNameLeft}")}{Adapter.QuoteSqlNameRight}"; + } + return $"{Adapter.QuoteSqlNameLeft}{string.Join($"{Adapter.QuoteSqlNameRight}.{Adapter.QuoteSqlNameLeft}", name)}{Adapter.QuoteSqlNameRight}"; } public override string TrimQuoteSqlName(string name) { @@ -55,6 +56,7 @@ namespace FreeSql.Odbc.Default //return $"{nametrim.TrimStart('[').TrimEnd(']').Replace("].[", ".").Replace(".[", ".")}"; return $"{nametrim.TrimStart(Adapter.QuoteSqlNameLeft).TrimEnd(Adapter.QuoteSqlNameRight).Replace($"{Adapter.QuoteSqlNameRight}.{Adapter.QuoteSqlNameLeft}", ".").Replace($".{Adapter.QuoteSqlNameLeft}", ".")}"; } + public override string[] SplitTableName(string name) => GetSplitTableNames(name, Adapter.QuoteSqlNameLeft, Adapter.QuoteSqlNameRight, 2); public override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; public override string IsNull(string sql, object value) => Adapter.IsNullSql(sql, value); public override string StringConcat(string[] objs, Type[] types) => Adapter.ConcatSql(objs, types); diff --git a/Providers/FreeSql.Provider.Odbc/GBase/__OdbcGBaseCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/GBase/__OdbcGBaseCodeFirst.cs index 2895d9de..9f3b6b11 100644 --- a/Providers/FreeSql.Provider.Odbc/GBase/__OdbcGBaseCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/GBase/__OdbcGBaseCodeFirst.cs @@ -90,14 +90,14 @@ namespace FreeSql.Odbc.GBase var tb = _commonUtils.GetTableByEntity(obj.entityType); if (tb == null) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ"); if (tb.Columns.Any() == false) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ锛屽彲杩佺Щ灞炴0涓"); - var tbname = tb.DbName.Split(new[] { '.' }, 2); + var tbname = _commonUtils.SplitTableName(tb.DbName); if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] }; - var tboldname = tb.DbOldName?.Split(new[] { '.' }, 2); //鏃ц〃鍚 + var tboldname = _commonUtils.SplitTableName(tb.DbOldName); //鏃ц〃鍚 if (tboldname?.Length == 1) tboldname = new[] { "public", tboldname[0] }; if (string.IsNullOrEmpty(obj.tableName) == false) { - var tbtmpname = obj.tableName.Split(new[] { '.' }, 2); + var tbtmpname = _commonUtils.SplitTableName(obj.tableName); if (tbtmpname?.Length == 1) tbtmpname = new[] { "public", tbtmpname[0] }; if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) { @@ -105,6 +105,7 @@ namespace FreeSql.Odbc.GBase tboldname = null; } } + //codefirst 涓嶆敮鎸佽〃鍚嶃佹ā寮忓悕銆佹暟鎹簱鍚嶄腑甯 . if (string.Compare(tbname[0], "public", true) != 0 && _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(" select 1 from pg_namespace where nspname={0}", tbname[0])) == null) //鍒涘缓妯″紡 sb.Append("CREATE SCHEMA IF NOT EXISTS ").Append(tbname[0]).Append(";\r\n"); diff --git a/Providers/FreeSql.Provider.Odbc/GBase/__OdbcGBaseUtils.cs b/Providers/FreeSql.Provider.Odbc/GBase/__OdbcGBaseUtils.cs index 535d561e..7c6a56e3 100644 --- a/Providers/FreeSql.Provider.Odbc/GBase/__OdbcGBaseUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/GBase/__OdbcGBaseUtils.cs @@ -1,16 +1,11 @@ 锘縰sing FreeSql.Internal; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.Concurrent; -using System.Data.Common; -using System.Linq; -using System.Net; -using System.Text; -using System.Linq.Expressions; -using System.Reflection; -using System.Data.Odbc; using FreeSql.Internal.Model; +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Data.Odbc; +using System.Linq; +using System.Text; namespace FreeSql.Odbc.GBase { @@ -94,12 +89,18 @@ namespace FreeSql.Odbc.GBase }); public override string FormatSql(string sql, params object[] args) => sql?.FormatOdbcPostgreSQL(args); - public override string QuoteSqlName(string name) + public override string QuoteSqlName(params string[] name) { - var nametrim = name.Trim(); - if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) - return nametrim; //鍘熺敓SQL - return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; + if (name.Length == 1) + { + var nametrim = name[0].Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //鍘熺敓SQL + if (nametrim.StartsWith("\"") && nametrim.EndsWith("\"")) + return nametrim; + return $"\"{nametrim.Replace(".", "\".\"")}\""; + } + return $"\"{string.Join("\".\"", name)}\""; } public override string TrimQuoteSqlName(string name) { @@ -108,6 +109,7 @@ namespace FreeSql.Odbc.GBase return nametrim; //鍘熺敓SQL return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; } + public override string[] SplitTableName(string name) => GetSplitTableNames(name, '"', '"', 2); public override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; public override string IsNull(string sql, object value) => $"coalesce({sql}, {value})"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs index 01361851..ea03dc69 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs @@ -101,14 +101,14 @@ namespace FreeSql.Odbc.MySql var tb = _commonUtils.GetTableByEntity(obj.entityType); if (tb == null) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ"); if (tb.Columns.Any() == false) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ锛屽彲杩佺Щ灞炴0涓"); - var tbname = tb.DbName.Split(new[] { '.' }, 2); + var tbname = _commonUtils.SplitTableName(tb.DbName); if (tbname?.Length == 1) tbname = new[] { database, tbname[0] }; - var tboldname = tb.DbOldName?.Split(new[] { '.' }, 2); //鏃ц〃鍚 + var tboldname = _commonUtils.SplitTableName(tb.DbOldName); //鏃ц〃鍚 if (tboldname?.Length == 1) tboldname = new[] { database, tboldname[0] }; if (string.IsNullOrEmpty(obj.tableName) == false) { - var tbtmpname = obj.tableName.Split(new[] { '.' }, 2); + var tbtmpname = _commonUtils.SplitTableName(obj.tableName); if (tbtmpname?.Length == 1) tbtmpname = new[] { database, tbtmpname[0] }; if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) { @@ -134,7 +134,7 @@ namespace FreeSql.Odbc.MySql if (tboldname == null) { //鍒涘缓琛 - var createTableName = _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}"); + var createTableName = _commonUtils.QuoteSqlName(tbname[0], tbname[1]); sb.Append("CREATE TABLE IF NOT EXISTS ").Append(createTableName).Append(" ( "); foreach (var tbcol in tb.ColumnsByPosition) { @@ -169,7 +169,7 @@ namespace FreeSql.Odbc.MySql } //濡傛灉鏂拌〃锛屾棫琛ㄥ湪涓涓暟鎹簱涓嬶紝鐩存帴淇敼琛ㄥ悕 if (string.Compare(tbname[0], tboldname[0], true) == 0) - sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}")).Append(" RENAME TO ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(";\r\n"); + sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName(tboldname[0], tboldname[1])).Append(" RENAME TO ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1])).Append(";\r\n"); else { //濡傛灉鏂拌〃锛屾棫琛ㄤ笉鍦ㄤ竴璧凤紝鍒涘缓鏂拌〃锛屽鍏ユ暟鎹紝鍒犻櫎鏃ц〃 @@ -226,8 +226,8 @@ where a.table_schema in ({0}) and a.table_name in ({1})", tboldname ?? tbname); isCommentChanged) { if (tbcol.Attribute.IsNullable != tbstructcol.is_nullable && tbcol.Attribute.IsNullable == false && tbcol.DbDefaultValue != "NULL" && tbcol.Attribute.IsIdentity == false) - sbalter.Append("UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" = ").Append(tbcol.DbDefaultValue).Append(" WHERE ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" IS NULL;\r\n"); - sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" MODIFY ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" ").Append(tbcol.Attribute.DbType); + sbalter.Append("UPDATE ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1])).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" = ").Append(tbcol.DbDefaultValue).Append(" WHERE ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" IS NULL;\r\n"); + sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1])).Append(" MODIFY ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" ").Append(tbcol.Attribute.DbType); if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append(" COMMENT ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "")); if (tbcol.Attribute.IsIdentity == true && tbcol.Attribute.DbType.IndexOf("AUTO_INCREMENT", StringComparison.CurrentCultureIgnoreCase) == -1) sbalter.Append(" AUTO_INCREMENT"); if (tbcol.Attribute.IsIdentity == true) sbalter.Append(existsPrimary == null ? "" : ", DROP PRIMARY KEY").Append(", ADD PRIMARY KEY(").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(")"); @@ -236,7 +236,7 @@ where a.table_schema in ({0}) and a.table_name in ({1})", tboldname ?? tbname); if (string.Compare(tbstructcol.column, tbcol.Attribute.OldName, true) == 0) { //淇敼鍒楀悕 - sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" CHANGE COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType); + sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1])).Append(" CHANGE COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType); if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append(" COMMENT ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "")); if (tbcol.Attribute.IsIdentity == true && tbcol.Attribute.DbType.IndexOf("AUTO_INCREMENT", StringComparison.CurrentCultureIgnoreCase) == -1) sbalter.Append(" AUTO_INCREMENT"); if (tbcol.Attribute.IsIdentity == true) sbalter.Append(existsPrimary == null ? "" : ", DROP PRIMARY KEY").Append(", ADD PRIMARY KEY(").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(")"); @@ -245,7 +245,7 @@ where a.table_schema in ({0}) and a.table_name in ({1})", tboldname ?? tbname); continue; } //娣诲姞鍒 - sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ADD ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType); + sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1])).Append(" ADD ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType); if (tbcol.Attribute.IsNullable == false && tbcol.DbDefaultValue != "NULL" && tbcol.Attribute.IsIdentity == false) sbalter.Append(" DEFAULT ").Append(tbcol.DbDefaultValue); if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append(" COMMENT ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "")); if (tbcol.Attribute.IsIdentity == true && tbcol.Attribute.DbType.IndexOf("AUTO_INCREMENT", StringComparison.CurrentCultureIgnoreCase) == -1) sbalter.Append(" AUTO_INCREMENT"); @@ -267,10 +267,10 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI var dsukfind1 = dsuk.Where(a => string.Compare(a[1], uk.Name, true) == 0).ToArray(); if (dsukfind1.Any() == false || dsukfind1.Length != uk.Columns.Length || dsukfind1.Where(a => (a[3] == "1") == uk.IsUnique && uk.Columns.Where(b => string.Compare(b.Column.Attribute.Name, a[0], true) == 0 && (a[2] == "1") == b.IsDesc).Any()).Count() != uk.Columns.Length) { - if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(";\r\n"); + if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1])).Append(";\r\n"); sbalter.Append("CREATE "); if (uk.IsUnique) sbalter.Append("UNIQUE "); - sbalter.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append("("); + sbalter.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1])).Append("("); foreach (var tbcol in uk.Columns) { sbalter.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); @@ -288,8 +288,8 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI } //鍒涘缓涓存椂琛紝鏁版嵁瀵艰繘涓存椂琛紝鐒跺悗鍒犻櫎鍘熻〃锛屽皢涓存椂琛ㄦ敼鍚嶄负鍘熻〃鍚 - var tablename = tboldname == null ? _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}") : _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}"); - var tmptablename = _commonUtils.QuoteSqlName($"{tbname[0]}.FreeSqlTmp_{tbname[1]}"); + var tablename = tboldname == null ? _commonUtils.QuoteSqlName(tbname[0], tbname[1]) : _commonUtils.QuoteSqlName(tboldname[0], tboldname[1]); + var tmptablename = _commonUtils.QuoteSqlName(tbname[0], $"FreeSqlTmp_{tbname[1]}"); //鍒涘缓涓存椂琛 sb.Append("CREATE TABLE IF NOT EXISTS ").Append(tmptablename).Append(" ( "); foreach (var tbcol in tb.ColumnsByPosition) @@ -332,7 +332,7 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI } sb.Remove(sb.Length - 2, 2).Append(" FROM ").Append(tablename).Append(";\r\n"); sb.Append("DROP TABLE ").Append(tablename).Append(";\r\n"); - sb.Append("ALTER TABLE ").Append(tmptablename).Append(" RENAME TO ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(";\r\n"); + sb.Append("ALTER TABLE ").Append(tmptablename).Append(" RENAME TO ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1])).Append(";\r\n"); //鍒涘缓琛ㄧ殑绱㈠紩 foreach (var uk in tb.Indexes) { diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs index 1e048430..50f45dbf 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs @@ -4,10 +4,6 @@ using System; using System.Collections.Generic; using System.Data.Common; using System.Data.Odbc; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using System.Text; namespace FreeSql.Odbc.MySql { @@ -40,12 +36,18 @@ namespace FreeSql.Odbc.MySql }); public override string FormatSql(string sql, params object[] args) => sql?.FormatOdbcMySql(args); - public override string QuoteSqlName(string name) + public override string QuoteSqlName(params string[] name) { - var nametrim = name.Trim(); - if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) - return nametrim; //鍘熺敓SQL - return $"`{nametrim.Trim('`').Replace(".", "`.`")}`"; + if (name.Length == 1) + { + var nametrim = name[0].Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //鍘熺敓SQL + if (nametrim.StartsWith("`") && nametrim.EndsWith("`")) + return nametrim; + return $"`{nametrim.Replace(".", "`.`")}`"; + } + return $"`{string.Join("`.`", name)}`"; } public override string TrimQuoteSqlName(string name) { @@ -54,6 +56,7 @@ namespace FreeSql.Odbc.MySql return nametrim; //鍘熺敓SQL return $"{nametrim.Trim('`').Replace("`.`", ".").Replace(".`", ".")}"; } + public override string[] SplitTableName(string name) => GetSplitTableNames(name, '`', '`', 2); public override string QuoteParamterName(string name) => $"?{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})"; public override string StringConcat(string[] objs, Type[] types) => $"concat({string.Join(", ", objs)})"; diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs index eece275f..302342ab 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs @@ -94,15 +94,15 @@ namespace FreeSql.Odbc.Oracle var tb = _commonUtils.GetTableByEntity(obj.entityType); if (tb == null) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ"); if (tb.Columns.Any() == false) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ锛屽彲杩佺Щ灞炴0涓"); - var tbname = tb.DbName.Split(new[] { '.' }, 2); + var tbname = _commonUtils.SplitTableName(tb.DbName); if (tbname?.Length == 1) tbname = new[] { userId, tbname[0] }; - var tboldname = tb.DbOldName?.Split(new[] { '.' }, 2); //鏃ц〃鍚 + var tboldname = _commonUtils.SplitTableName(tb.DbOldName); //鏃ц〃鍚 if (tboldname?.Length == 1) tboldname = new[] { userId, tboldname[0] }; var primaryKeyName = (obj.entityType.GetCustomAttributes(typeof(OraclePrimaryKeyNameAttribute), false)?.FirstOrDefault() as OraclePrimaryKeyNameAttribute)?.Name; if (string.IsNullOrEmpty(obj.tableName) == false) { - var tbtmpname = obj.tableName.Split(new[] { '.' }, 2); + var tbtmpname = _commonUtils.SplitTableName(obj.tableName); if (tbtmpname?.Length == 1) tbtmpname = new[] { userId, tbtmpname[0] }; if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) { @@ -111,6 +111,7 @@ namespace FreeSql.Odbc.Oracle primaryKeyName = null; } } + //codefirst 涓嶆敮鎸佽〃鍚嶄腑甯 . if (string.Compare(tbname[0], userId) != 0 && _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(" select 1 from sys.dba_users where username={0}", tbname[0])) == null) //鍒涘缓鏁版嵁搴 throw new NotImplementedException($"Oracle CodeFirst 涓嶆敮鎸佷唬鐮佸垱寤 tablespace 涓 schemas {tbname[0]}"); diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs index bf7dc392..9054c31b 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs @@ -4,8 +4,6 @@ using System; using System.Collections.Generic; using System.Data.Common; using System.Data.Odbc; -using System.Linq.Expressions; -using System.Text; namespace FreeSql.Odbc.Oracle { @@ -68,12 +66,18 @@ namespace FreeSql.Odbc.Oracle }); public override string FormatSql(string sql, params object[] args) => sql?.FormatOdbcOracle(args); - public override string QuoteSqlName(string name) + public override string QuoteSqlName(params string[] name) { - var nametrim = name.Trim(); - if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) - return nametrim; //鍘熺敓SQL - return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; + if (name.Length == 1) + { + var nametrim = name[0].Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //鍘熺敓SQL + if (nametrim.StartsWith("\"") && nametrim.EndsWith("\"")) + return nametrim; + return $"\"{nametrim.Replace(".", "\".\"")}\""; + } + return $"\"{string.Join("\".\"", name)}\""; } public override string TrimQuoteSqlName(string name) { @@ -82,6 +86,7 @@ namespace FreeSql.Odbc.Oracle return nametrim; //鍘熺敓SQL return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; } + public override string[] SplitTableName(string name) => GetSplitTableNames(name, '"', '"', 2); public override string QuoteParamterName(string name) => $":{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; public override string IsNull(string sql, object value) => $"nvl({sql}, {value})"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLCodeFirst.cs index 6872fc2f..a09e2223 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLCodeFirst.cs @@ -90,14 +90,14 @@ namespace FreeSql.Odbc.PostgreSQL var tb = _commonUtils.GetTableByEntity(obj.entityType); if (tb == null) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ"); if (tb.Columns.Any() == false) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ锛屽彲杩佺Щ灞炴0涓"); - var tbname = tb.DbName.Split(new[] { '.' }, 2); + var tbname = _commonUtils.SplitTableName(tb.DbName); if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] }; - var tboldname = tb.DbOldName?.Split(new[] { '.' }, 2); //鏃ц〃鍚 + var tboldname = _commonUtils.SplitTableName(tb.DbOldName); //鏃ц〃鍚 if (tboldname?.Length == 1) tboldname = new[] { "public", tboldname[0] }; if (string.IsNullOrEmpty(obj.tableName) == false) { - var tbtmpname = obj.tableName.Split(new[] { '.' }, 2); + var tbtmpname = _commonUtils.SplitTableName(obj.tableName); if (tbtmpname?.Length == 1) tbtmpname = new[] { "public", tbtmpname[0] }; if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) { @@ -105,6 +105,7 @@ namespace FreeSql.Odbc.PostgreSQL tboldname = null; } } + //codefirst 涓嶆敮鎸佽〃鍚嶃佹ā寮忓悕銆佹暟鎹簱鍚嶄腑甯 . if (string.Compare(tbname[0], "public", true) != 0 && _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(" select 1 from pg_namespace where nspname={0}", tbname[0])) == null) //鍒涘缓妯″紡 sb.Append("CREATE SCHEMA IF NOT EXISTS ").Append(tbname[0]).Append(";\r\n"); diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs index e139a342..62d259e3 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs @@ -1,16 +1,11 @@ 锘縰sing FreeSql.Internal; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.Concurrent; -using System.Data.Common; -using System.Linq; -using System.Net; -using System.Text; -using System.Linq.Expressions; -using System.Reflection; -using System.Data.Odbc; using FreeSql.Internal.Model; +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Data.Odbc; +using System.Linq; +using System.Text; namespace FreeSql.Odbc.PostgreSQL { @@ -94,12 +89,18 @@ namespace FreeSql.Odbc.PostgreSQL }); public override string FormatSql(string sql, params object[] args) => sql?.FormatOdbcPostgreSQL(args); - public override string QuoteSqlName(string name) + public override string QuoteSqlName(params string[] name) { - var nametrim = name.Trim(); - if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) - return nametrim; //鍘熺敓SQL - return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; + if (name.Length == 1) + { + var nametrim = name[0].Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //鍘熺敓SQL + if (nametrim.StartsWith("\"") && nametrim.EndsWith("\"")) + return nametrim; + return $"\"{nametrim.Replace(".", "\".\"")}\""; + } + return $"\"{string.Join("\".\"", name)}\""; } public override string TrimQuoteSqlName(string name) { @@ -108,6 +109,7 @@ namespace FreeSql.Odbc.PostgreSQL return nametrim; //鍘熺敓SQL return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; } + public override string[] SplitTableName(string name) => GetSplitTableNames(name, '"', '"', 2); public override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; public override string IsNull(string sql, object value) => $"coalesce({sql}, {value})"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs index 87d5f2bb..95f4b76d 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs @@ -135,16 +135,16 @@ ELSE var tb = _commonUtils.GetTableByEntity(obj.entityType); if (tb == null) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ"); if (tb.Columns.Any() == false) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ锛屽彲杩佺Щ灞炴0涓"); - var tbname = tb.DbName.Split(new[] { '.' }, 3); + var tbname = _commonUtils.SplitTableName(tb.DbName); if (tbname?.Length == 1) tbname = new[] { database, "dbo", tbname[0] }; if (tbname?.Length == 2) tbname = new[] { database, tbname[0], tbname[1] }; - var tboldname = tb.DbOldName?.Split(new[] { '.' }, 3); //鏃ц〃鍚 + var tboldname = _commonUtils.SplitTableName(tb.DbOldName); //鏃ц〃鍚 if (tboldname?.Length == 1) tboldname = new[] { database, "dbo", tboldname[0] }; if (tboldname?.Length == 2) tboldname = new[] { database, tboldname[0], tboldname[1] }; if (string.IsNullOrEmpty(obj.tableName) == false) { - var tbtmpname = obj.tableName.Split(new[] { '.' }, 3); + var tbtmpname = _commonUtils.SplitTableName(obj.tableName); if (tbtmpname?.Length == 1) tbtmpname = new[] { database, "dbo", tbtmpname[0] }; if (tbtmpname?.Length == 2) tbtmpname = new[] { database, tbtmpname[0], tbtmpname[1] }; if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1] || tbname[2] != tbtmpname[2]) @@ -153,6 +153,7 @@ ELSE tboldname = null; } } + //codefirst 涓嶆敮鎸佽〃鍚嶃佹ā寮忓悕銆佹暟鎹簱鍚嶄腑甯 . if (string.Compare(tbname[0], database, true) != 0 && ExecuteScalar(database, $" select 1 from sys.databases where name='{tbname[0]}'") == null) //鍒涘缓鏁版嵁搴 ExecuteScalar(database, $"if not exists(select 1 from sys.databases where name='{tbname[0]}')\r\n\tcreate database [{tbname[0]}];"); diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerUtils.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerUtils.cs index dd0d11d9..adfa99ab 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerUtils.cs @@ -2,11 +2,8 @@ using FreeSql.Internal.Model; using System; using System.Collections.Generic; -using System.Data; using System.Data.Common; using System.Data.Odbc; -using System.Linq; -using System.Linq.Expressions; using System.Text; namespace FreeSql.Odbc.SqlServer @@ -44,12 +41,18 @@ namespace FreeSql.Odbc.SqlServer }); public override string FormatSql(string sql, params object[] args) => sql?.FormatOdbcSqlServer(args); - public override string QuoteSqlName(string name) + public override string QuoteSqlName(params string[] name) { - var nametrim = name.Trim(); - if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) - return nametrim; //鍘熺敓SQL - return $"[{nametrim.TrimStart('[').TrimEnd(']').Replace(".", "].[")}]"; + if (name.Length == 1) + { + var nametrim = name[0].Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //鍘熺敓SQL + if (nametrim.StartsWith("[") && nametrim.EndsWith("]")) + return nametrim; + return $"[{nametrim.Replace(".", "].[")}]"; + } + return $"[{string.Join("].[", name)}]"; } public override string TrimQuoteSqlName(string name) { @@ -58,6 +61,7 @@ namespace FreeSql.Odbc.SqlServer return nametrim; //鍘熺敓SQL return $"{nametrim.TrimStart('[').TrimEnd(']').Replace("].[", ".").Replace(".[", ".")}"; } + public override string[] SplitTableName(string name) => GetSplitTableNames(name, '[', ']', 3); public override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; public override string IsNull(string sql, object value) => $"isnull({sql}, {value})"; public override string StringConcat(string[] objs, Type[] types) diff --git a/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs b/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs index 85a273e7..40942739 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs @@ -95,15 +95,15 @@ namespace FreeSql.Oracle var tb = _commonUtils.GetTableByEntity(obj.entityType); if (tb == null) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ"); if (tb.Columns.Any() == false) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ锛屽彲杩佺Щ灞炴0涓"); - var tbname = tb.DbName.Split(new[] { '.' }, 2); + var tbname = _commonUtils.SplitTableName(tb.DbName); if (tbname?.Length == 1) tbname = new[] { userId, tbname[0] }; - var tboldname = tb.DbOldName?.Split(new[] { '.' }, 2); //鏃ц〃鍚 + var tboldname = _commonUtils.SplitTableName(tb.DbOldName); //鏃ц〃鍚 if (tboldname?.Length == 1) tboldname = new[] { userId, tboldname[0] }; var primaryKeyName = (obj.entityType.GetCustomAttributes(typeof(OraclePrimaryKeyNameAttribute), false)?.FirstOrDefault() as OraclePrimaryKeyNameAttribute)?.Name; if (string.IsNullOrEmpty(obj.tableName) == false) { - var tbtmpname = obj.tableName.Split(new[] { '.' }, 2); + var tbtmpname = _commonUtils.SplitTableName(obj.tableName); if (tbtmpname?.Length == 1) tbtmpname = new[] { userId, tbtmpname[0] }; if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) { @@ -112,6 +112,7 @@ namespace FreeSql.Oracle primaryKeyName = null; } } + //codefirst 涓嶆敮鎸佽〃鍚嶄腑甯 . if (string.Compare(tbname[0], userId) != 0 && _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(" select 1 from sys.dba_users where username={0}", tbname[0])) == null) //鍒涘缓鏁版嵁搴 throw new NotImplementedException($"Oracle CodeFirst 涓嶆敮鎸佷唬鐮佸垱寤 tablespace 涓 schemas {tbname[0]}"); diff --git a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs index f3a7621e..d28c66c5 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs @@ -4,8 +4,6 @@ using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using System.Data.Common; -using System.Linq.Expressions; -using System.Text; namespace FreeSql.Oracle { @@ -63,12 +61,18 @@ namespace FreeSql.Oracle }); public override string FormatSql(string sql, params object[] args) => sql?.FormatOracle(args); - public override string QuoteSqlName(string name) + public override string QuoteSqlName(params string[] name) { - var nametrim = name.Trim(); - if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) - return nametrim; //鍘熺敓SQL - return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; + if (name.Length == 1) + { + var nametrim = name[0].Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //鍘熺敓SQL + if (nametrim.StartsWith("\"") && nametrim.EndsWith("\"")) + return nametrim; + return $"\"{nametrim.Replace(".", "\".\"")}\""; + } + return $"\"{string.Join("\".\"", name)}\""; } public override string TrimQuoteSqlName(string name) { @@ -77,6 +81,7 @@ namespace FreeSql.Oracle return nametrim; //鍘熺敓SQL return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; } + public override string[] SplitTableName(string name) => GetSplitTableNames(name, '"', '"', 2); public override string QuoteParamterName(string name) => $":{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; public override string IsNull(string sql, object value) => $"nvl({sql}, {value})"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs index ebc6d40f..15c92508 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs @@ -1,13 +1,10 @@ -锘縰sing FreeSql.DataAnnotations; -using FreeSql.DatabaseModel; -using FreeSql.Internal; +锘縰sing FreeSql.Internal; using FreeSql.Internal.Model; using Newtonsoft.Json.Linq; using Npgsql.LegacyPostgis; using NpgsqlTypes; using System; using System.Collections; -using System.Collections.Concurrent; using System.Collections.Generic; using System.Data; using System.Linq; @@ -128,14 +125,14 @@ namespace FreeSql.PostgreSQL var tb = _commonUtils.GetTableByEntity(obj.entityType); if (tb == null) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ"); if (tb.Columns.Any() == false) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ锛屽彲杩佺Щ灞炴0涓"); - var tbname = tb.DbName.Split(new[] { '.' }, 2); + var tbname = _commonUtils.SplitTableName(tb.DbName); if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] }; - var tboldname = tb.DbOldName?.Split(new[] { '.' }, 2); //鏃ц〃鍚 + var tboldname = _commonUtils.SplitTableName(tb.DbOldName); //鏃ц〃鍚 if (tboldname?.Length == 1) tboldname = new[] { "public", tboldname[0] }; if (string.IsNullOrEmpty(obj.tableName) == false) { - var tbtmpname = obj.tableName.Split(new[] { '.' }, 2); + var tbtmpname = _commonUtils.SplitTableName(obj.tableName); if (tbtmpname?.Length == 1) tbtmpname = new[] { "public", tbtmpname[0] }; if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) { @@ -143,6 +140,7 @@ namespace FreeSql.PostgreSQL tboldname = null; } } + //codefirst 涓嶆敮鎸佽〃鍚嶃佹ā寮忓悕銆佹暟鎹簱鍚嶄腑甯 . if (string.Compare(tbname[0], "public", true) != 0 && _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(" select 1 from pg_namespace where nspname={0}", tbname[0])) == null) //鍒涘缓妯″紡 sb.Append("CREATE SCHEMA IF NOT EXISTS ").Append(tbname[0]).Append(";\r\n"); diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs index 729e3b18..08d541e3 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs @@ -1,19 +1,17 @@ 锘縰sing FreeSql.Internal; +using FreeSql.Internal.Model; using Newtonsoft.Json.Linq; using Npgsql; using Npgsql.LegacyPostgis; using NpgsqlTypes; using System; using System.Collections; -using System.Collections.Generic; using System.Collections.Concurrent; +using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Net; using System.Text; -using System.Linq.Expressions; -using System.Reflection; -using FreeSql.Internal.Model; namespace FreeSql.PostgreSQL { @@ -120,12 +118,18 @@ namespace FreeSql.PostgreSQL }); public override string FormatSql(string sql, params object[] args) => sql?.FormatPostgreSQL(args); - public override string QuoteSqlName(string name) + public override string QuoteSqlName(params string[] name) { - var nametrim = name.Trim(); - if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) - return nametrim; //鍘熺敓SQL - return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; + if (name.Length == 1) + { + var nametrim = name[0].Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //鍘熺敓SQL + if (nametrim.StartsWith("\"") && nametrim.EndsWith("\"")) + return nametrim; + return $"\"{nametrim.Replace(".", "\".\"")}\""; + } + return $"\"{string.Join("\".\"", name)}\""; } public override string TrimQuoteSqlName(string name) { @@ -134,6 +138,7 @@ namespace FreeSql.PostgreSQL return nametrim; //鍘熺敓SQL return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; } + public override string[] SplitTableName(string name) => GetSplitTableNames(name, '"', '"', 2); public override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; public override string IsNull(string sql, object value) => $"coalesce({sql}, {value})"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs index 127acd83..86927f95 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs @@ -1,14 +1,10 @@ -锘縰sing FreeSql.DataAnnotations; -using FreeSql.DatabaseModel; -using FreeSql.Internal; +锘縰sing FreeSql.Internal; using FreeSql.Internal.Model; using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; -using System.Text.RegularExpressions; namespace FreeSql.SqlServer { @@ -138,16 +134,16 @@ ELSE var tb = _commonUtils.GetTableByEntity(obj.entityType); if (tb == null) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ"); if (tb.Columns.Any() == false) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ锛屽彲杩佺Щ灞炴0涓"); - var tbname = tb.DbName.Split(new[] { '.' }, 3); + var tbname = _commonUtils.SplitTableName(tb.DbName); if (tbname?.Length == 1) tbname = new[] { database, "dbo", tbname[0] }; if (tbname?.Length == 2) tbname = new[] { database, tbname[0], tbname[1] }; - var tboldname = tb.DbOldName?.Split(new[] { '.' }, 3); //鏃ц〃鍚 + var tboldname = _commonUtils.SplitTableName(tb.DbOldName); //鏃ц〃鍚 if (tboldname?.Length == 1) tboldname = new[] { database, "dbo", tboldname[0] }; if (tboldname?.Length == 2) tboldname = new[] { database, tboldname[0], tboldname[1] }; if (string.IsNullOrEmpty(obj.tableName) == false) { - var tbtmpname = obj.tableName.Split(new[] { '.' }, 3); + var tbtmpname = _commonUtils.SplitTableName(obj.tableName); if (tbtmpname?.Length == 1) tbtmpname = new[] { database, "dbo", tbtmpname[0] }; if (tbtmpname?.Length == 2) tbtmpname = new[] { database, tbtmpname[0], tbtmpname[1] }; if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1] || tbname[2] != tbtmpname[2]) @@ -156,6 +152,7 @@ ELSE tboldname = null; } } + //codefirst 涓嶆敮鎸佽〃鍚嶃佹ā寮忓悕銆佹暟鎹簱鍚嶄腑甯 . if (string.Compare(tbname[0], database, true) != 0 && ExecuteScalar(database, $" select 1 from sys.databases where name='{tbname[0]}'") == null) //鍒涘缓鏁版嵁搴 ExecuteScalar(database, $"if not exists(select 1 from sys.databases where name='{tbname[0]}')\r\n\tcreate database [{tbname[0]}];"); diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs index ef5e5b8b..748ebf00 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs @@ -5,8 +5,6 @@ using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Data.SqlClient; -using System.Linq; -using System.Linq.Expressions; using System.Text; namespace FreeSql.SqlServer @@ -55,12 +53,18 @@ namespace FreeSql.SqlServer }); public override string FormatSql(string sql, params object[] args) => sql?.FormatSqlServer(args); - public override string QuoteSqlName(string name) + public override string QuoteSqlName(params string[] name) { - var nametrim = name.Trim(); - if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) - return nametrim; //鍘熺敓SQL - return $"[{nametrim.TrimStart('[').TrimEnd(']').Replace(".", "].[")}]"; + if (name.Length == 1) + { + var nametrim = name[0].Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //鍘熺敓SQL + if (nametrim.StartsWith("[") && nametrim.EndsWith("]")) + return nametrim; + return $"[{nametrim.Replace(".", "].[")}]"; + } + return $"[{string.Join("].[", name)}]"; } public override string TrimQuoteSqlName(string name) { @@ -69,6 +73,7 @@ namespace FreeSql.SqlServer return nametrim; //鍘熺敓SQL return $"{nametrim.TrimStart('[').TrimEnd(']').Replace("].[", ".").Replace(".[", ".")}"; } + public override string[] SplitTableName(string name) => GetSplitTableNames(name, '[', ']', 3); public override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; public override string IsNull(string sql, object value) => $"isnull({sql}, {value})"; public override string StringConcat(string[] objs, Type[] types) diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteCodeFirst.cs b/Providers/FreeSql.Provider.Sqlite/SqliteCodeFirst.cs index fa1a718d..4806504c 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteCodeFirst.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteCodeFirst.cs @@ -1,9 +1,5 @@ -锘縰sing FreeSql.DataAnnotations; -using FreeSql.DatabaseModel; -using FreeSql.Internal; -using FreeSql.Internal.Model; +锘縰sing FreeSql.Internal; using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.Data; using System.Linq; @@ -83,14 +79,14 @@ namespace FreeSql.Sqlite var tb = _commonUtils.GetTableByEntity(obj.entityType); if (tb == null) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ"); if (tb.Columns.Any() == false) throw new Exception($"绫诲瀷 {obj.entityType.FullName} 涓嶅彲杩佺Щ锛屽彲杩佺Щ灞炴0涓"); - var tbname = tb.DbName.Split(new[] { '.' }, 2); + var tbname = _commonUtils.SplitTableName(tb.DbName); if (tbname?.Length == 1) tbname = new[] { "main", tbname[0] }; - var tboldname = tb.DbOldName?.Split(new[] { '.' }, 2); //鏃ц〃鍚 + var tboldname = _commonUtils.SplitTableName(tb.DbOldName); //鏃ц〃鍚 if (tboldname?.Length == 1) tboldname = new[] { "main", tboldname[0] }; if (string.IsNullOrEmpty(obj.tableName) == false) { - var tbtmpname = obj.tableName.Split(new[] { '.' }, 2); + var tbtmpname = _commonUtils.SplitTableName(obj.tableName); if (tbtmpname?.Length == 1) tbtmpname = new[] { "main", tbtmpname[0] }; if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) { @@ -113,7 +109,7 @@ namespace FreeSql.Sqlite if (tboldname == null) { //鍒涘缓琛 - var createTableName = _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}"); + var createTableName = _commonUtils.QuoteSqlName(tbname[0], tbname[1]); sb.Append("CREATE TABLE IF NOT EXISTS ").Append(createTableName).Append(" ( "); foreach (var tbcol in tb.ColumnsByPosition) { @@ -151,7 +147,7 @@ namespace FreeSql.Sqlite } //濡傛灉鏂拌〃锛屾棫琛ㄥ湪涓涓ā寮忎笅锛岀洿鎺ヤ慨鏀硅〃鍚 if (string.Compare(tbname[0], tboldname[0], true) == 0) - sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}")).Append(" RENAME TO ").Append(_commonUtils.QuoteSqlName($"{tbname[1]}")).Append(";\r\n"); + sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName(tboldname[0], tboldname[1])).Append(" RENAME TO \"").Append(tbname[1]).Append("\";\r\n"); else { //濡傛灉鏂拌〃锛屾棫琛ㄤ笉鍦ㄤ竴璧凤紝鍒涘缓鏂拌〃锛屽鍏ユ暟鎹紝鍒犻櫎鏃ц〃 @@ -234,9 +230,9 @@ namespace FreeSql.Sqlite } //鍒涘缓涓存椂琛紝鏁版嵁瀵艰繘涓存椂琛紝鐒跺悗鍒犻櫎鍘熻〃锛屽皢涓存椂琛ㄦ敼鍚嶄负鍘熻〃鍚 - var tablename = tboldname == null ? _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}") : _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}"); - var tablenameOnlyTb = tboldname == null ? _commonUtils.QuoteSqlName(tbname[1]) : _commonUtils.QuoteSqlName(tboldname[1]); - var tmptablename = _commonUtils.QuoteSqlName($"{tbname[0]}._FreeSqlTmp_{tbname[1]}"); + var tablename = tboldname == null ? _commonUtils.QuoteSqlName(tbname[0], tbname[1]) : _commonUtils.QuoteSqlName(tboldname[0], tboldname[1]); + var tablenameOnlyTb = tboldname == null ? tbname[1] : tboldname[1]; + var tmptablename = _commonUtils.QuoteSqlName(tbname[0], $"_FreeSqlTmp_{tbname[1]}"); //鍒涘缓涓存椂琛 isIndent = false; sb.Append("CREATE TABLE IF NOT EXISTS ").Append(tmptablename).Append(" ( "); @@ -283,13 +279,13 @@ namespace FreeSql.Sqlite } sb.Remove(sb.Length - 2, 2).Append(" FROM ").Append(tablename).Append(";\r\n"); sb.Append("DROP TABLE ").Append(tablename).Append(";\r\n"); - sb.Append("ALTER TABLE ").Append(tmptablename).Append(" RENAME TO ").Append(_commonUtils.QuoteSqlName($"{tbname[1]}")).Append(";\r\n"); + sb.Append("ALTER TABLE ").Append(tmptablename).Append(" RENAME TO \"").Append(tbname[1]).Append("\";\r\n"); //鍒涘缓琛ㄧ殑绱㈠紩 foreach (var uk in tb.Indexes) { sb.Append("CREATE "); if (uk.IsUnique) sb.Append("UNIQUE "); - sb.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(tablenameOnlyTb).Append("("); + sb.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON \"").Append(tablenameOnlyTb).Append("\"("); foreach (var tbcol in uk.Columns) { sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs b/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs index 12b81771..ef9b986d 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs @@ -4,8 +4,6 @@ using System; using System.Collections.Generic; using System.Data; using System.Data.Common; -using System.Linq.Expressions; -using System.Text; namespace FreeSql.Sqlite { @@ -66,12 +64,18 @@ namespace FreeSql.Sqlite }); public override string FormatSql(string sql, params object[] args) => sql?.FormatSqlite(args); - public override string QuoteSqlName(string name) + public override string QuoteSqlName(params string[] name) { - var nametrim = name.Trim(); - if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) - return nametrim; //鍘熺敓SQL - return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; + if (name.Length == 1) + { + var nametrim = name[0].Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //鍘熺敓SQL + if (nametrim.StartsWith("\"") && nametrim.EndsWith("\"")) + return nametrim; + return $"\"{nametrim.Replace(".", "\".\"")}\""; + } + return $"\"{string.Join("\".\"", name)}\""; } public override string TrimQuoteSqlName(string name) { @@ -80,6 +84,7 @@ namespace FreeSql.Sqlite return nametrim; //鍘熺敓SQL return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; } + public override string[] SplitTableName(string name) => GetSplitTableNames(name, '"', '"', 2); public override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}";