mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
- 解决 表名名称包含点,无法进行 CRUD 的问题,由于测试的复杂性,此类情况仅支持 MySql/Sqlite CodeFirst 自动迁移;
> 注意:尽量不要使用带点的表名,只有 MySql/Sqlite 对此类表名支持 CodeFirst。但是它不影响 CRUD 功能,使用 [Table(Name = "`sys.config`")] 解决
This commit is contained in:
parent
3fe4c54ee4
commit
994cc475c2
@ -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)
|
||||||
|
{
|
||||||
|
if (this.FullTableName.IndexOf('.') == -1)
|
||||||
sb.Add("Name = \"" + this.FullTableName + "\"");
|
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) + ")]";
|
||||||
|
@ -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 中文表_字段()
|
||||||
|
@ -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 中文表_字段()
|
||||||
|
78
FreeSql.Tests/FreeSql.Tests/Internal/CommonUtilsTest.cs
Normal file
78
FreeSql.Tests/FreeSql.Tests/Internal/CommonUtilsTest.cs
Normal 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]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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 中文表_字段()
|
||||||
{
|
{
|
||||||
|
@ -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 中文表_字段()
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
{
|
||||||
|
var nametrim = name[0].Trim();
|
||||||
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
||||||
return nametrim; //原生SQL
|
return nametrim; //原生SQL
|
||||||
return $"[{nametrim.TrimStart('[').TrimEnd(']').Replace(".", "].[")}]";
|
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)
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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)
|
||||||
|
{
|
||||||
|
var nametrim = name[0].Trim();
|
||||||
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
||||||
return nametrim; //原生SQL
|
return nametrim; //原生SQL
|
||||||
return $"`{nametrim.Trim('`').Replace(".", "`.`")}`";
|
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)})";
|
||||||
|
@ -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)
|
||||||
|
{
|
||||||
|
var nametrim = name[0].Trim();
|
||||||
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
||||||
return nametrim; //原生SQL
|
return nametrim; //原生SQL
|
||||||
return $"`{nametrim.Trim('`').Replace(".", "`.`")}`";
|
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)})";
|
||||||
|
@ -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]}");
|
||||||
|
@ -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)
|
||||||
|
{
|
||||||
|
var nametrim = name[0].Trim();
|
||||||
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
||||||
return nametrim; //原生SQL
|
return nametrim; //原生SQL
|
||||||
return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\"";
|
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)}";
|
||||||
|
@ -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,14 +35,19 @@ 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)
|
||||||
|
{
|
||||||
|
var nametrim = name[0].Trim();
|
||||||
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
||||||
return nametrim; //原生SQL
|
return nametrim; //原生SQL
|
||||||
//return $"[{nametrim.TrimStart('[').TrimEnd(']').Replace(".", "].[")}]";
|
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}{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)
|
||||||
{
|
{
|
||||||
var nametrim = name.Trim();
|
var nametrim = name.Trim();
|
||||||
@ -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);
|
||||||
|
@ -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");
|
||||||
|
@ -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)
|
||||||
|
{
|
||||||
|
var nametrim = name[0].Trim();
|
||||||
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
||||||
return nametrim; //原生SQL
|
return nametrim; //原生SQL
|
||||||
return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\"";
|
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)}";
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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)
|
||||||
|
{
|
||||||
|
var nametrim = name[0].Trim();
|
||||||
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
||||||
return nametrim; //原生SQL
|
return nametrim; //原生SQL
|
||||||
return $"`{nametrim.Trim('`').Replace(".", "`.`")}`";
|
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)})";
|
||||||
|
@ -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]}");
|
||||||
|
@ -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)
|
||||||
|
{
|
||||||
|
var nametrim = name[0].Trim();
|
||||||
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
||||||
return nametrim; //原生SQL
|
return nametrim; //原生SQL
|
||||||
return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\"";
|
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)}";
|
||||||
|
@ -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");
|
||||||
|
@ -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)
|
||||||
|
{
|
||||||
|
var nametrim = name[0].Trim();
|
||||||
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
||||||
return nametrim; //原生SQL
|
return nametrim; //原生SQL
|
||||||
return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\"";
|
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)}";
|
||||||
|
@ -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]}];");
|
||||||
|
@ -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)
|
||||||
|
{
|
||||||
|
var nametrim = name[0].Trim();
|
||||||
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
||||||
return nametrim; //原生SQL
|
return nametrim; //原生SQL
|
||||||
return $"[{nametrim.TrimStart('[').TrimEnd(']').Replace(".", "].[")}]";
|
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)
|
||||||
|
@ -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]}");
|
||||||
|
@ -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)
|
||||||
|
{
|
||||||
|
var nametrim = name[0].Trim();
|
||||||
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
||||||
return nametrim; //原生SQL
|
return nametrim; //原生SQL
|
||||||
return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\"";
|
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)}";
|
||||||
|
@ -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");
|
||||||
|
@ -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)
|
||||||
|
{
|
||||||
|
var nametrim = name[0].Trim();
|
||||||
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
||||||
return nametrim; //原生SQL
|
return nametrim; //原生SQL
|
||||||
return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\"";
|
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)}";
|
||||||
|
@ -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]}];");
|
||||||
|
@ -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)
|
||||||
|
{
|
||||||
|
var nametrim = name[0].Trim();
|
||||||
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
||||||
return nametrim; //原生SQL
|
return nametrim; //原生SQL
|
||||||
return $"[{nametrim.TrimStart('[').TrimEnd(']').Replace(".", "].[")}]";
|
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)
|
||||||
|
@ -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));
|
||||||
|
@ -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)
|
||||||
|
{
|
||||||
|
var nametrim = name[0].Trim();
|
||||||
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
|
||||||
return nametrim; //原生SQL
|
return nametrim; //原生SQL
|
||||||
return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\"";
|
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)}";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user