- 解决 表名名称包含点,无法进行 CRUD 的问题,由于测试的复杂性,此类情况仅支持 MySql/Sqlite CodeFirst 自动迁移;

> 注意:尽量不要使用带点的表名,只有 MySql/Sqlite 对此类表名支持 CodeFirst。但是它不影响 CRUD 功能,使用 [Table(Name = "`sys.config`")] 解决
This commit is contained in:
28810 2020-01-11 02:22:16 +08:00
parent 3fe4c54ee4
commit 994cc475c2
33 changed files with 467 additions and 214 deletions

View File

@ -4,7 +4,6 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading.Tasks;
public class RazorModel { public class RazorModel {
public RazorModel(IFreeSql fsql, string nameSpace, bool[] NameOptions, List<DbTableInfo> tables, DbTableInfo table) { public RazorModel(IFreeSql fsql, string nameSpace, bool[] NameOptions, List<DbTableInfo> tables, DbTableInfo table) {
@ -55,7 +54,12 @@ public class RazorModel {
var sb = new List<string>(); var sb = new List<string>();
if (GetCsName(this.FullTableName) != this.FullTableName) 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; if (sb.Any() == false) return null;
return "[Table(" + string.Join(", ", sb) + ")]"; return "[Table(" + string.Join(", ", sb) + ")]";

View File

@ -10,6 +10,33 @@ namespace FreeSql.Tests.MySqlConnector
{ {
public class MySqlCodeFirstTest public class MySqlCodeFirstTest
{ {
[Fact]
public void ±íÃûÖÐÓеã()
{
var item = new tbdot01 { name = "insert" };
g.mysql.Insert(item).ExecuteAffrows();
var find = g.mysql.Select<tbdot01>().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<tbdot01>().Set(a => a.name == "update").Where(a => a.id == item.id).ExecuteAffrows());
find = g.mysql.Select<tbdot01>().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<tbdot01>().Where(a => a.id == item.id).ExecuteAffrows());
find = g.mysql.Select<tbdot01>().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] [Fact]
public void _字段() public void _字段()

View File

@ -10,6 +10,33 @@ namespace FreeSql.Tests.Odbc.MySql
{ {
public class MySqlCodeFirstTest public class MySqlCodeFirstTest
{ {
[Fact]
public void ±íÃûÖÐÓеã()
{
var item = new tbdot01 { name = "insert" };
g.mysql.Insert(item).ExecuteAffrows();
var find = g.mysql.Select<tbdot01>().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<tbdot01>().Set(a => a.name == "update").Where(a => a.id == item.id).ExecuteAffrows());
find = g.mysql.Select<tbdot01>().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<tbdot01>().Where(a => a.id == item.id).ExecuteAffrows());
find = g.mysql.Select<tbdot01>().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] [Fact]
public void _字段() public void _字段()

View File

@ -0,0 +1,78 @@
using 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]);
}
}
}

View File

@ -11,6 +11,34 @@ namespace FreeSql.Tests.MySql
public class MySqlCodeFirstTest public class MySqlCodeFirstTest
{ {
[Fact]
public void ±íÃûÖÐÓеã()
{
var item = new tbdot01 { name = "insert" };
g.mysql.Insert(item).ExecuteAffrows();
var find = g.mysql.Select<tbdot01>().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<tbdot01>().Set(a => a.name == "update").Where(a => a.id == item.id).ExecuteAffrows());
find = g.mysql.Select<tbdot01>().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<tbdot01>().Where(a => a.id == item.id).ExecuteAffrows());
find = g.mysql.Select<tbdot01>().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] [Fact]
public void _字段() public void _字段()
{ {

View File

@ -11,6 +11,34 @@ namespace FreeSql.Tests.Sqlite
public class SqliteCodeFirstTest public class SqliteCodeFirstTest
{ {
[Fact]
public void ±íÃûÖÐÓеã()
{
var item = new tbdot01 { name = "insert" };
g.sqlite.Insert(item).ExecuteAffrows();
var find = g.sqlite.Select<tbdot01>().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<tbdot01>().Set(a => a.name == "update").Where(a => a.id == item.id).ExecuteAffrows());
find = g.sqlite.Select<tbdot01>().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<tbdot01>().Where(a => a.id == item.id).ExecuteAffrows());
find = g.sqlite.Select<tbdot01>().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] [Fact]
public void _字段() public void _字段()
{ {

View File

@ -27,8 +27,23 @@ namespace FreeSql.Internal
public abstract DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col, Type type, object value); public abstract DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col, Type type, object value);
public abstract DbParameter[] GetDbParamtersByObject(string sql, object obj); public abstract DbParameter[] GetDbParamtersByObject(string sql, object obj);
public abstract string FormatSql(string sql, params object[] args); 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 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 QuoteParamterName(string name);
public abstract string IsNull(string sql, object value); public abstract string IsNull(string sql, object value);
public abstract string StringConcat(string[] objs, Type[] types); public abstract string StringConcat(string[] objs, Type[] types);

View File

@ -22,7 +22,7 @@ namespace FreeSql.MsAccess.Curd
#if net40 #if net40
#else #else
async public override Task<List<T1>> ExecuteDeletedAsync() public override Task<List<T1>> ExecuteDeletedAsync()
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }

View File

@ -2,11 +2,8 @@
using FreeSql.Internal.Model; using FreeSql.Internal.Model;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data;
using System.Data.Common; using System.Data.Common;
using System.Data.OleDb; using System.Data.OleDb;
using System.Linq;
using System.Linq.Expressions;
using System.Text; using System.Text;
namespace FreeSql.MsAccess 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 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 (name.Length == 1)
if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) {
return nametrim; //原生SQL var nametrim = name[0].Trim();
return $"[{nametrim.TrimStart('[').TrimEnd(']').Replace(".", "].[")}]"; 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) public override string TrimQuoteSqlName(string name)
{ {
@ -54,6 +57,7 @@ namespace FreeSql.MsAccess
return nametrim; //原生SQL return nametrim; //原生SQL
return $"{nametrim.TrimStart('[').TrimEnd(']').Replace("].[", ".").Replace(".[", ".")}"; 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 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 IsNull(string sql, object value) => $"iif(isnull({sql}), {value}, {sql})";
public override string StringConcat(string[] objs, Type[] types) public override string StringConcat(string[] objs, Type[] types)

View File

@ -1,10 +1,6 @@
using FreeSql.DataAnnotations; using FreeSql.Internal;
using FreeSql.DatabaseModel;
using FreeSql.Internal;
using FreeSql.Internal.Model;
using MySql.Data.MySqlClient; using MySql.Data.MySqlClient;
using System; using System;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data; using System.Data;
using System.Linq; using System.Linq;
@ -112,14 +108,14 @@ namespace FreeSql.MySql
var tb = _commonUtils.GetTableByEntity(obj.entityType); var tb = _commonUtils.GetTableByEntity(obj.entityType);
if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移"); if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移");
if (tb.Columns.Any() == false) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移可迁移属性0个"); 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] }; 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 (tboldname?.Length == 1) tboldname = new[] { database, tboldname[0] };
if (string.IsNullOrEmpty(obj.tableName) == false) 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 (tbtmpname?.Length == 1) tbtmpname = new[] { database, tbtmpname[0] };
if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1])
{ {
@ -145,7 +141,7 @@ namespace FreeSql.MySql
if (tboldname == null) 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(" ( "); sb.Append("CREATE TABLE IF NOT EXISTS ").Append(createTableName).Append(" ( ");
foreach (var tbcol in tb.ColumnsByPosition) foreach (var tbcol in tb.ColumnsByPosition)
{ {
@ -180,7 +176,7 @@ namespace FreeSql.MySql
} }
//如果新表,旧表在一个数据库下,直接修改表名 //如果新表,旧表在一个数据库下,直接修改表名
if (string.Compare(tbname[0], tboldname[0], true) == 0) 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 else
{ {
//如果新表,旧表不在一起,创建新表,导入数据,删除旧表 //如果新表,旧表不在一起,创建新表,导入数据,删除旧表
@ -237,8 +233,8 @@ where a.table_schema in ({0}) and a.table_name in ({1})", tboldname ?? tbname);
isCommentChanged) isCommentChanged)
{ {
if (tbcol.Attribute.IsNullable != tbstructcol.is_nullable && tbcol.Attribute.IsNullable == false && tbcol.DbDefaultValue != "NULL" && tbcol.Attribute.IsIdentity == false) 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("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("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 (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 && 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(")"); 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) 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 (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 && 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(")"); 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; 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 (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 (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 && 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(); 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() == 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 "); sbalter.Append("CREATE ");
if (uk.IsUnique) sbalter.Append("UNIQUE "); 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) foreach (var tbcol in uk.Columns)
{ {
sbalter.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); 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 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 tmptablename = _commonUtils.QuoteSqlName(tbname[0], $"FreeSqlTmp_{tbname[1]}");
//创建临时表 //创建临时表
sb.Append("CREATE TABLE IF NOT EXISTS ").Append(tmptablename).Append(" ( "); sb.Append("CREATE TABLE IF NOT EXISTS ").Append(tmptablename).Append(" ( ");
foreach (var tbcol in tb.ColumnsByPosition) 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.Remove(sb.Length - 2, 2).Append(" FROM ").Append(tablename).Append(";\r\n");
sb.Append("DROP TABLE ").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) foreach (var uk in tb.Indexes)
{ {

View File

@ -4,10 +4,6 @@ using MySql.Data.MySqlClient;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.Common; using System.Data.Common;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
namespace FreeSql.MySql 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 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 (name.Length == 1)
if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) {
return nametrim; //原生SQL var nametrim = name[0].Trim();
return $"`{nametrim.Trim('`').Replace(".", "`.`")}`"; 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) public override string TrimQuoteSqlName(string name)
{ {
@ -83,6 +85,7 @@ namespace FreeSql.MySql
return nametrim; //原生SQL return nametrim; //原生SQL
return $"{nametrim.Trim('`').Replace("`.`", ".").Replace(".`", ".")}"; 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 QuoteParamterName(string name) => $"?{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}";
public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})"; public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) => $"concat({string.Join(", ", objs)})"; public override string StringConcat(string[] objs, Type[] types) => $"concat({string.Join(", ", objs)})";

View File

@ -4,10 +4,6 @@ using MySql.Data.MySqlClient;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.Common; using System.Data.Common;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
namespace FreeSql.MySql 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 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 (name.Length == 1)
if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) {
return nametrim; //原生SQL var nametrim = name[0].Trim();
return $"`{nametrim.Trim('`').Replace(".", "`.`")}`"; 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) public override string TrimQuoteSqlName(string name)
{ {
@ -91,6 +93,7 @@ namespace FreeSql.MySql
return nametrim; //原生SQL return nametrim; //原生SQL
return $"{nametrim.Trim('`').Replace("`.`", ".").Replace(".`", ".")}"; 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 QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}";
public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})"; public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) => $"concat({string.Join(", ", objs)})"; public override string StringConcat(string[] objs, Type[] types) => $"concat({string.Join(", ", objs)})";

View File

@ -94,15 +94,15 @@ namespace FreeSql.Odbc.Dameng
var tb = _commonUtils.GetTableByEntity(obj.entityType); var tb = _commonUtils.GetTableByEntity(obj.entityType);
if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移"); if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移");
if (tb.Columns.Any() == false) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移可迁移属性0个"); 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] }; 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] }; if (tboldname?.Length == 1) tboldname = new[] { userId, tboldname[0] };
var primaryKeyName = (obj.entityType.GetCustomAttributes(typeof(OraclePrimaryKeyNameAttribute), false)?.FirstOrDefault() as OraclePrimaryKeyNameAttribute)?.Name; var primaryKeyName = (obj.entityType.GetCustomAttributes(typeof(OraclePrimaryKeyNameAttribute), false)?.FirstOrDefault() as OraclePrimaryKeyNameAttribute)?.Name;
if (string.IsNullOrEmpty(obj.tableName) == false) 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 (tbtmpname?.Length == 1) tbtmpname = new[] { userId, tbtmpname[0] };
if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1])
{ {
@ -111,6 +111,7 @@ namespace FreeSql.Odbc.Dameng
primaryKeyName = null; 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) //创建数据库 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]}"); throw new NotImplementedException($"Oracle CodeFirst 不支持代码创建 tablespace 与 schemas {tbname[0]}");

View File

@ -4,8 +4,6 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.Common; using System.Data.Common;
using System.Data.Odbc; using System.Data.Odbc;
using System.Linq.Expressions;
using System.Text;
namespace FreeSql.Odbc.Dameng 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 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 (name.Length == 1)
if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) {
return nametrim; //原生SQL var nametrim = name[0].Trim();
return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; 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) public override string TrimQuoteSqlName(string name)
{ {
@ -82,6 +86,7 @@ namespace FreeSql.Odbc.Dameng
return nametrim; //原生SQL return nametrim; //原生SQL
return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; 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 QuoteParamterName(string name) => $":{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}";
public override string IsNull(string sql, object value) => $"nvl({sql}, {value})"; public override string IsNull(string sql, object value) => $"nvl({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}";

View File

@ -2,12 +2,8 @@
using FreeSql.Internal.Model; using FreeSql.Internal.Model;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data;
using System.Data.Common; using System.Data.Common;
using System.Data.Odbc; using System.Data.Odbc;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
namespace FreeSql.Odbc.Default 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 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 (name.Length == 1)
if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) {
return nametrim; //原生SQL var nametrim = name[0].Trim();
//return $"[{nametrim.TrimStart('[').TrimEnd(']').Replace(".", "].[")}]"; if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
return $"{Adapter.QuoteSqlNameLeft}{nametrim.TrimStart(Adapter.QuoteSqlNameLeft).TrimEnd(Adapter.QuoteSqlNameRight).Replace(".", $"{Adapter.QuoteSqlNameRight}.{Adapter.QuoteSqlNameLeft}")}{Adapter.QuoteSqlNameRight}"; 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) public override string TrimQuoteSqlName(string name)
{ {
@ -55,6 +56,7 @@ namespace FreeSql.Odbc.Default
//return $"{nametrim.TrimStart('[').TrimEnd(']').Replace("].[", ".").Replace(".[", ".")}"; //return $"{nametrim.TrimStart('[').TrimEnd(']').Replace("].[", ".").Replace(".[", ".")}";
return $"{nametrim.TrimStart(Adapter.QuoteSqlNameLeft).TrimEnd(Adapter.QuoteSqlNameRight).Replace($"{Adapter.QuoteSqlNameRight}.{Adapter.QuoteSqlNameLeft}", ".").Replace($".{Adapter.QuoteSqlNameLeft}", ".")}"; 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 QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}";
public override string IsNull(string sql, object value) => Adapter.IsNullSql(sql, value); public override string IsNull(string sql, object value) => Adapter.IsNullSql(sql, value);
public override string StringConcat(string[] objs, Type[] types) => Adapter.ConcatSql(objs, types); public override string StringConcat(string[] objs, Type[] types) => Adapter.ConcatSql(objs, types);

View File

@ -90,14 +90,14 @@ namespace FreeSql.Odbc.GBase
var tb = _commonUtils.GetTableByEntity(obj.entityType); var tb = _commonUtils.GetTableByEntity(obj.entityType);
if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移"); if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移");
if (tb.Columns.Any() == false) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移可迁移属性0个"); 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] }; 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 (tboldname?.Length == 1) tboldname = new[] { "public", tboldname[0] };
if (string.IsNullOrEmpty(obj.tableName) == false) 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 (tbtmpname?.Length == 1) tbtmpname = new[] { "public", tbtmpname[0] };
if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1])
{ {
@ -105,6 +105,7 @@ namespace FreeSql.Odbc.GBase
tboldname = null; 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) //创建模式 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"); sb.Append("CREATE SCHEMA IF NOT EXISTS ").Append(tbname[0]).Append(";\r\n");

View File

@ -1,16 +1,11 @@
using FreeSql.Internal; using 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 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 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 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 (name.Length == 1)
if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) {
return nametrim; //原生SQL var nametrim = name[0].Trim();
return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; 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) public override string TrimQuoteSqlName(string name)
{ {
@ -108,6 +109,7 @@ namespace FreeSql.Odbc.GBase
return nametrim; //原生SQL return nametrim; //原生SQL
return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; 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 QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}";
public override string IsNull(string sql, object value) => $"coalesce({sql}, {value})"; public override string IsNull(string sql, object value) => $"coalesce({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}";

View File

@ -101,14 +101,14 @@ namespace FreeSql.Odbc.MySql
var tb = _commonUtils.GetTableByEntity(obj.entityType); var tb = _commonUtils.GetTableByEntity(obj.entityType);
if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移"); if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移");
if (tb.Columns.Any() == false) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移可迁移属性0个"); 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] }; 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 (tboldname?.Length == 1) tboldname = new[] { database, tboldname[0] };
if (string.IsNullOrEmpty(obj.tableName) == false) 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 (tbtmpname?.Length == 1) tbtmpname = new[] { database, tbtmpname[0] };
if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1])
{ {
@ -134,7 +134,7 @@ namespace FreeSql.Odbc.MySql
if (tboldname == null) 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(" ( "); sb.Append("CREATE TABLE IF NOT EXISTS ").Append(createTableName).Append(" ( ");
foreach (var tbcol in tb.ColumnsByPosition) foreach (var tbcol in tb.ColumnsByPosition)
{ {
@ -169,7 +169,7 @@ namespace FreeSql.Odbc.MySql
} }
//如果新表,旧表在一个数据库下,直接修改表名 //如果新表,旧表在一个数据库下,直接修改表名
if (string.Compare(tbname[0], tboldname[0], true) == 0) 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 else
{ {
//如果新表,旧表不在一起,创建新表,导入数据,删除旧表 //如果新表,旧表不在一起,创建新表,导入数据,删除旧表
@ -226,8 +226,8 @@ where a.table_schema in ({0}) and a.table_name in ({1})", tboldname ?? tbname);
isCommentChanged) isCommentChanged)
{ {
if (tbcol.Attribute.IsNullable != tbstructcol.is_nullable && tbcol.Attribute.IsNullable == false && tbcol.DbDefaultValue != "NULL" && tbcol.Attribute.IsIdentity == false) 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("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("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 (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 && 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(")"); 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) 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 (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 && 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(")"); 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; 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 (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 (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 && 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(); 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() == 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 "); sbalter.Append("CREATE ");
if (uk.IsUnique) sbalter.Append("UNIQUE "); 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) foreach (var tbcol in uk.Columns)
{ {
sbalter.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); 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 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 tmptablename = _commonUtils.QuoteSqlName(tbname[0], $"FreeSqlTmp_{tbname[1]}");
//创建临时表 //创建临时表
sb.Append("CREATE TABLE IF NOT EXISTS ").Append(tmptablename).Append(" ( "); sb.Append("CREATE TABLE IF NOT EXISTS ").Append(tmptablename).Append(" ( ");
foreach (var tbcol in tb.ColumnsByPosition) 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.Remove(sb.Length - 2, 2).Append(" FROM ").Append(tablename).Append(";\r\n");
sb.Append("DROP TABLE ").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) foreach (var uk in tb.Indexes)
{ {

View File

@ -4,10 +4,6 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.Common; using System.Data.Common;
using System.Data.Odbc; using System.Data.Odbc;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
namespace FreeSql.Odbc.MySql 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 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 (name.Length == 1)
if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) {
return nametrim; //原生SQL var nametrim = name[0].Trim();
return $"`{nametrim.Trim('`').Replace(".", "`.`")}`"; 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) public override string TrimQuoteSqlName(string name)
{ {
@ -54,6 +56,7 @@ namespace FreeSql.Odbc.MySql
return nametrim; //原生SQL return nametrim; //原生SQL
return $"{nametrim.Trim('`').Replace("`.`", ".").Replace(".`", ".")}"; 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 QuoteParamterName(string name) => $"?{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}";
public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})"; public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) => $"concat({string.Join(", ", objs)})"; public override string StringConcat(string[] objs, Type[] types) => $"concat({string.Join(", ", objs)})";

View File

@ -94,15 +94,15 @@ namespace FreeSql.Odbc.Oracle
var tb = _commonUtils.GetTableByEntity(obj.entityType); var tb = _commonUtils.GetTableByEntity(obj.entityType);
if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移"); if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移");
if (tb.Columns.Any() == false) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移可迁移属性0个"); 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] }; 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] }; if (tboldname?.Length == 1) tboldname = new[] { userId, tboldname[0] };
var primaryKeyName = (obj.entityType.GetCustomAttributes(typeof(OraclePrimaryKeyNameAttribute), false)?.FirstOrDefault() as OraclePrimaryKeyNameAttribute)?.Name; var primaryKeyName = (obj.entityType.GetCustomAttributes(typeof(OraclePrimaryKeyNameAttribute), false)?.FirstOrDefault() as OraclePrimaryKeyNameAttribute)?.Name;
if (string.IsNullOrEmpty(obj.tableName) == false) 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 (tbtmpname?.Length == 1) tbtmpname = new[] { userId, tbtmpname[0] };
if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1])
{ {
@ -111,6 +111,7 @@ namespace FreeSql.Odbc.Oracle
primaryKeyName = null; 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) //创建数据库 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]}"); throw new NotImplementedException($"Oracle CodeFirst 不支持代码创建 tablespace 与 schemas {tbname[0]}");

View File

@ -4,8 +4,6 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.Common; using System.Data.Common;
using System.Data.Odbc; using System.Data.Odbc;
using System.Linq.Expressions;
using System.Text;
namespace FreeSql.Odbc.Oracle 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 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 (name.Length == 1)
if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) {
return nametrim; //原生SQL var nametrim = name[0].Trim();
return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; 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) public override string TrimQuoteSqlName(string name)
{ {
@ -82,6 +86,7 @@ namespace FreeSql.Odbc.Oracle
return nametrim; //原生SQL return nametrim; //原生SQL
return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; 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 QuoteParamterName(string name) => $":{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}";
public override string IsNull(string sql, object value) => $"nvl({sql}, {value})"; public override string IsNull(string sql, object value) => $"nvl({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}";

View File

@ -90,14 +90,14 @@ namespace FreeSql.Odbc.PostgreSQL
var tb = _commonUtils.GetTableByEntity(obj.entityType); var tb = _commonUtils.GetTableByEntity(obj.entityType);
if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移"); if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移");
if (tb.Columns.Any() == false) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移可迁移属性0个"); 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] }; 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 (tboldname?.Length == 1) tboldname = new[] { "public", tboldname[0] };
if (string.IsNullOrEmpty(obj.tableName) == false) 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 (tbtmpname?.Length == 1) tbtmpname = new[] { "public", tbtmpname[0] };
if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1])
{ {
@ -105,6 +105,7 @@ namespace FreeSql.Odbc.PostgreSQL
tboldname = null; 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) //创建模式 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"); sb.Append("CREATE SCHEMA IF NOT EXISTS ").Append(tbname[0]).Append(";\r\n");

View File

@ -1,16 +1,11 @@
using FreeSql.Internal; using 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 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 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 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 (name.Length == 1)
if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) {
return nametrim; //原生SQL var nametrim = name[0].Trim();
return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; 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) public override string TrimQuoteSqlName(string name)
{ {
@ -108,6 +109,7 @@ namespace FreeSql.Odbc.PostgreSQL
return nametrim; //原生SQL return nametrim; //原生SQL
return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; 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 QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}";
public override string IsNull(string sql, object value) => $"coalesce({sql}, {value})"; public override string IsNull(string sql, object value) => $"coalesce({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}";

View File

@ -135,16 +135,16 @@ ELSE
var tb = _commonUtils.GetTableByEntity(obj.entityType); var tb = _commonUtils.GetTableByEntity(obj.entityType);
if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移"); if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移");
if (tb.Columns.Any() == false) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移可迁移属性0个"); 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 == 1) tbname = new[] { database, "dbo", tbname[0] };
if (tbname?.Length == 2) tbname = new[] { database, tbname[0], tbname[1] }; 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 == 1) tboldname = new[] { database, "dbo", tboldname[0] };
if (tboldname?.Length == 2) tboldname = new[] { database, tboldname[0], tboldname[1] }; if (tboldname?.Length == 2) tboldname = new[] { database, tboldname[0], tboldname[1] };
if (string.IsNullOrEmpty(obj.tableName) == false) 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 == 1) tbtmpname = new[] { database, "dbo", tbtmpname[0] };
if (tbtmpname?.Length == 2) tbtmpname = new[] { database, tbtmpname[0], tbtmpname[1] }; if (tbtmpname?.Length == 2) tbtmpname = new[] { database, tbtmpname[0], tbtmpname[1] };
if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1] || tbname[2] != tbtmpname[2]) if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1] || tbname[2] != tbtmpname[2])
@ -153,6 +153,7 @@ ELSE
tboldname = null; tboldname = null;
} }
} }
//codefirst 不支持表名、模式名、数据库名中带 .
if (string.Compare(tbname[0], database, true) != 0 && ExecuteScalar(database, $" select 1 from sys.databases where name='{tbname[0]}'") == null) //创建数据库 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]}];"); ExecuteScalar(database, $"if not exists(select 1 from sys.databases where name='{tbname[0]}')\r\n\tcreate database [{tbname[0]}];");

View File

@ -2,11 +2,8 @@
using FreeSql.Internal.Model; using FreeSql.Internal.Model;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data;
using System.Data.Common; using System.Data.Common;
using System.Data.Odbc; using System.Data.Odbc;
using System.Linq;
using System.Linq.Expressions;
using System.Text; using System.Text;
namespace FreeSql.Odbc.SqlServer 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 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 (name.Length == 1)
if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) {
return nametrim; //原生SQL var nametrim = name[0].Trim();
return $"[{nametrim.TrimStart('[').TrimEnd(']').Replace(".", "].[")}]"; 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) public override string TrimQuoteSqlName(string name)
{ {
@ -58,6 +61,7 @@ namespace FreeSql.Odbc.SqlServer
return nametrim; //原生SQL return nametrim; //原生SQL
return $"{nametrim.TrimStart('[').TrimEnd(']').Replace("].[", ".").Replace(".[", ".")}"; 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 QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}";
public override string IsNull(string sql, object value) => $"isnull({sql}, {value})"; public override string IsNull(string sql, object value) => $"isnull({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) public override string StringConcat(string[] objs, Type[] types)

View File

@ -95,15 +95,15 @@ namespace FreeSql.Oracle
var tb = _commonUtils.GetTableByEntity(obj.entityType); var tb = _commonUtils.GetTableByEntity(obj.entityType);
if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移"); if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移");
if (tb.Columns.Any() == false) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移可迁移属性0个"); 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] }; 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] }; if (tboldname?.Length == 1) tboldname = new[] { userId, tboldname[0] };
var primaryKeyName = (obj.entityType.GetCustomAttributes(typeof(OraclePrimaryKeyNameAttribute), false)?.FirstOrDefault() as OraclePrimaryKeyNameAttribute)?.Name; var primaryKeyName = (obj.entityType.GetCustomAttributes(typeof(OraclePrimaryKeyNameAttribute), false)?.FirstOrDefault() as OraclePrimaryKeyNameAttribute)?.Name;
if (string.IsNullOrEmpty(obj.tableName) == false) 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 (tbtmpname?.Length == 1) tbtmpname = new[] { userId, tbtmpname[0] };
if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1])
{ {
@ -112,6 +112,7 @@ namespace FreeSql.Oracle
primaryKeyName = null; 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) //创建数据库 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]}"); throw new NotImplementedException($"Oracle CodeFirst 不支持代码创建 tablespace 与 schemas {tbname[0]}");

View File

@ -4,8 +4,6 @@ using Oracle.ManagedDataAccess.Client;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.Common; using System.Data.Common;
using System.Linq.Expressions;
using System.Text;
namespace FreeSql.Oracle 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 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 (name.Length == 1)
if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) {
return nametrim; //原生SQL var nametrim = name[0].Trim();
return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; 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) public override string TrimQuoteSqlName(string name)
{ {
@ -77,6 +81,7 @@ namespace FreeSql.Oracle
return nametrim; //原生SQL return nametrim; //原生SQL
return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; 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 QuoteParamterName(string name) => $":{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}";
public override string IsNull(string sql, object value) => $"nvl({sql}, {value})"; public override string IsNull(string sql, object value) => $"nvl({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}";

View File

@ -1,13 +1,10 @@
using FreeSql.DataAnnotations; using FreeSql.Internal;
using FreeSql.DatabaseModel;
using FreeSql.Internal;
using FreeSql.Internal.Model; using FreeSql.Internal.Model;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Npgsql.LegacyPostgis; using Npgsql.LegacyPostgis;
using NpgsqlTypes; using NpgsqlTypes;
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data; using System.Data;
using System.Linq; using System.Linq;
@ -128,14 +125,14 @@ namespace FreeSql.PostgreSQL
var tb = _commonUtils.GetTableByEntity(obj.entityType); var tb = _commonUtils.GetTableByEntity(obj.entityType);
if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移"); if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移");
if (tb.Columns.Any() == false) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移可迁移属性0个"); 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] }; 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 (tboldname?.Length == 1) tboldname = new[] { "public", tboldname[0] };
if (string.IsNullOrEmpty(obj.tableName) == false) 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 (tbtmpname?.Length == 1) tbtmpname = new[] { "public", tbtmpname[0] };
if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1])
{ {
@ -143,6 +140,7 @@ namespace FreeSql.PostgreSQL
tboldname = null; 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) //创建模式 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"); sb.Append("CREATE SCHEMA IF NOT EXISTS ").Append(tbname[0]).Append(";\r\n");

View File

@ -1,19 +1,17 @@
using FreeSql.Internal; using FreeSql.Internal;
using FreeSql.Internal.Model;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Npgsql; using Npgsql;
using Npgsql.LegacyPostgis; using Npgsql.LegacyPostgis;
using NpgsqlTypes; using NpgsqlTypes;
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data.Common; using System.Data.Common;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Text; using System.Text;
using System.Linq.Expressions;
using System.Reflection;
using FreeSql.Internal.Model;
namespace FreeSql.PostgreSQL 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 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 (name.Length == 1)
if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) {
return nametrim; //原生SQL var nametrim = name[0].Trim();
return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; 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) public override string TrimQuoteSqlName(string name)
{ {
@ -134,6 +138,7 @@ namespace FreeSql.PostgreSQL
return nametrim; //原生SQL return nametrim; //原生SQL
return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; 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 QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}";
public override string IsNull(string sql, object value) => $"coalesce({sql}, {value})"; public override string IsNull(string sql, object value) => $"coalesce({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}";

View File

@ -1,14 +1,10 @@
using FreeSql.DataAnnotations; using FreeSql.Internal;
using FreeSql.DatabaseModel;
using FreeSql.Internal;
using FreeSql.Internal.Model; using FreeSql.Internal.Model;
using System; using System;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data; using System.Data;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.RegularExpressions;
namespace FreeSql.SqlServer namespace FreeSql.SqlServer
{ {
@ -138,16 +134,16 @@ ELSE
var tb = _commonUtils.GetTableByEntity(obj.entityType); var tb = _commonUtils.GetTableByEntity(obj.entityType);
if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移"); if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移");
if (tb.Columns.Any() == false) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移可迁移属性0个"); 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 == 1) tbname = new[] { database, "dbo", tbname[0] };
if (tbname?.Length == 2) tbname = new[] { database, tbname[0], tbname[1] }; 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 == 1) tboldname = new[] { database, "dbo", tboldname[0] };
if (tboldname?.Length == 2) tboldname = new[] { database, tboldname[0], tboldname[1] }; if (tboldname?.Length == 2) tboldname = new[] { database, tboldname[0], tboldname[1] };
if (string.IsNullOrEmpty(obj.tableName) == false) 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 == 1) tbtmpname = new[] { database, "dbo", tbtmpname[0] };
if (tbtmpname?.Length == 2) tbtmpname = new[] { database, tbtmpname[0], tbtmpname[1] }; if (tbtmpname?.Length == 2) tbtmpname = new[] { database, tbtmpname[0], tbtmpname[1] };
if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1] || tbname[2] != tbtmpname[2]) if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1] || tbname[2] != tbtmpname[2])
@ -156,6 +152,7 @@ ELSE
tboldname = null; tboldname = null;
} }
} }
//codefirst 不支持表名、模式名、数据库名中带 .
if (string.Compare(tbname[0], database, true) != 0 && ExecuteScalar(database, $" select 1 from sys.databases where name='{tbname[0]}'") == null) //创建数据库 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]}];"); ExecuteScalar(database, $"if not exists(select 1 from sys.databases where name='{tbname[0]}')\r\n\tcreate database [{tbname[0]}];");

View File

@ -5,8 +5,6 @@ using System.Collections.Generic;
using System.Data; using System.Data;
using System.Data.Common; using System.Data.Common;
using System.Data.SqlClient; using System.Data.SqlClient;
using System.Linq;
using System.Linq.Expressions;
using System.Text; using System.Text;
namespace FreeSql.SqlServer 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 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 (name.Length == 1)
if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) {
return nametrim; //原生SQL var nametrim = name[0].Trim();
return $"[{nametrim.TrimStart('[').TrimEnd(']').Replace(".", "].[")}]"; 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) public override string TrimQuoteSqlName(string name)
{ {
@ -69,6 +73,7 @@ namespace FreeSql.SqlServer
return nametrim; //原生SQL return nametrim; //原生SQL
return $"{nametrim.TrimStart('[').TrimEnd(']').Replace("].[", ".").Replace(".[", ".")}"; 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 QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}";
public override string IsNull(string sql, object value) => $"isnull({sql}, {value})"; public override string IsNull(string sql, object value) => $"isnull({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) public override string StringConcat(string[] objs, Type[] types)

View File

@ -1,9 +1,5 @@
using FreeSql.DataAnnotations; using FreeSql.Internal;
using FreeSql.DatabaseModel;
using FreeSql.Internal;
using FreeSql.Internal.Model;
using System; using System;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data; using System.Data;
using System.Linq; using System.Linq;
@ -83,14 +79,14 @@ namespace FreeSql.Sqlite
var tb = _commonUtils.GetTableByEntity(obj.entityType); var tb = _commonUtils.GetTableByEntity(obj.entityType);
if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移"); if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移");
if (tb.Columns.Any() == false) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移可迁移属性0个"); 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] }; 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 (tboldname?.Length == 1) tboldname = new[] { "main", tboldname[0] };
if (string.IsNullOrEmpty(obj.tableName) == false) 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 (tbtmpname?.Length == 1) tbtmpname = new[] { "main", tbtmpname[0] };
if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1])
{ {
@ -113,7 +109,7 @@ namespace FreeSql.Sqlite
if (tboldname == null) 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(" ( "); sb.Append("CREATE TABLE IF NOT EXISTS ").Append(createTableName).Append(" ( ");
foreach (var tbcol in tb.ColumnsByPosition) foreach (var tbcol in tb.ColumnsByPosition)
{ {
@ -151,7 +147,7 @@ namespace FreeSql.Sqlite
} }
//如果新表,旧表在一个模式下,直接修改表名 //如果新表,旧表在一个模式下,直接修改表名
if (string.Compare(tbname[0], tboldname[0], true) == 0) 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 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 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 tablenameOnlyTb = tboldname == null ? tbname[1] : tboldname[1];
var tmptablename = _commonUtils.QuoteSqlName($"{tbname[0]}._FreeSqlTmp_{tbname[1]}"); var tmptablename = _commonUtils.QuoteSqlName(tbname[0], $"_FreeSqlTmp_{tbname[1]}");
//创建临时表 //创建临时表
isIndent = false; isIndent = false;
sb.Append("CREATE TABLE IF NOT EXISTS ").Append(tmptablename).Append(" ( "); 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.Remove(sb.Length - 2, 2).Append(" FROM ").Append(tablename).Append(";\r\n");
sb.Append("DROP TABLE ").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) foreach (var uk in tb.Indexes)
{ {
sb.Append("CREATE "); sb.Append("CREATE ");
if (uk.IsUnique) sb.Append("UNIQUE "); 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) foreach (var tbcol in uk.Columns)
{ {
sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));

View File

@ -4,8 +4,6 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data; using System.Data;
using System.Data.Common; using System.Data.Common;
using System.Linq.Expressions;
using System.Text;
namespace FreeSql.Sqlite 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 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 (name.Length == 1)
if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) {
return nametrim; //原生SQL var nametrim = name[0].Trim();
return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; 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) public override string TrimQuoteSqlName(string name)
{ {
@ -80,6 +84,7 @@ namespace FreeSql.Sqlite
return nametrim; //原生SQL return nametrim; //原生SQL
return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; 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 QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}";
public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})"; public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}";