Skip to content

Commit ec077ba

Browse files
2881028810
authored andcommitted
- 优化 sqlserver 表中带点 codefirst;
1 parent 9a7eb96 commit ec077ba

File tree

6 files changed

+119
-22
lines changed

6 files changed

+119
-22
lines changed

FreeSql.Tests/FreeSql.Tests.Provider.Odbc/FreeSql.Tests.Provider.Odbc.xml

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerCodeFirstTest.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,40 @@ class TS_SLTB
2828
public string TitleSub { get; set; }
2929
}
3030

31+
[Fact]
32+
public void 表名中有点()
33+
{
34+
var item = new tbdot01 { name = "insert" };
35+
g.sqlserver.Insert(item).ExecuteAffrows();
36+
37+
var find = g.sqlserver.Select<tbdot01>().Where(a => a.id == item.id).First();
38+
Assert.NotNull(find);
39+
Assert.Equal(item.id, find.id);
40+
Assert.Equal("insert", find.name);
41+
42+
Assert.Equal(1, g.sqlserver.Update<tbdot01>().Set(a => a.name == "update").Where(a => a.id == item.id).ExecuteAffrows());
43+
find = g.sqlserver.Select<tbdot01>().Where(a => a.id == item.id).First();
44+
Assert.NotNull(find);
45+
Assert.Equal(item.id, find.id);
46+
Assert.Equal("update", find.name);
47+
48+
Assert.Equal(1, g.sqlserver.Delete<tbdot01>().Where(a => a.id == item.id).ExecuteAffrows());
49+
find = g.sqlserver.Select<tbdot01>().Where(a => a.id == item.id).First();
50+
Assert.Null(find);
51+
}
52+
/// <summary>
53+
/// 表中带点
54+
/// </summary>
55+
[Table(Name = "[freesql.T].[dbo].[sys.tbdot01]")]
56+
class tbdot01
57+
{
58+
/// <summary>
59+
/// 主键
60+
/// </summary>
61+
public Guid id { get; set; }
62+
public string name { get; set; }
63+
}
64+
3165
[Fact]
3266
public void 中文表_字段()
3367
{

FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,40 @@ class TS_SLTB
6060
public string TitleSub { get; set; }
6161
}
6262

63+
[Fact]
64+
public void 表名中有点()
65+
{
66+
var item = new tbdot01 { name = "insert" };
67+
g.sqlserver.Insert(item).ExecuteAffrows();
68+
69+
var find = g.sqlserver.Select<tbdot01>().Where(a => a.id == item.id).First();
70+
Assert.NotNull(find);
71+
Assert.Equal(item.id, find.id);
72+
Assert.Equal("insert", find.name);
73+
74+
Assert.Equal(1, g.sqlserver.Update<tbdot01>().Set(a => a.name == "update").Where(a => a.id == item.id).ExecuteAffrows());
75+
find = g.sqlserver.Select<tbdot01>().Where(a => a.id == item.id).First();
76+
Assert.NotNull(find);
77+
Assert.Equal(item.id, find.id);
78+
Assert.Equal("update", find.name);
79+
80+
Assert.Equal(1, g.sqlserver.Delete<tbdot01>().Where(a => a.id == item.id).ExecuteAffrows());
81+
find = g.sqlserver.Select<tbdot01>().Where(a => a.id == item.id).First();
82+
Assert.Null(find);
83+
}
84+
/// <summary>
85+
/// 表中带点
86+
/// </summary>
87+
[Table(Name = "[freesql.T].[dbo].[sys.tbdot01]")]
88+
class tbdot01
89+
{
90+
/// <summary>
91+
/// 主键
92+
/// </summary>
93+
public Guid id { get; set; }
94+
public string name { get; set; }
95+
}
96+
6397
[Fact]
6498
public void 中文表_字段()
6599
{

Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,8 @@ protected override string GetComparisonDDLStatements(params TypeAndName[] object
204204
if (tboldname == null)
205205
{
206206
//创建表
207-
var createTableName = _commonUtils.QuoteSqlName($"{tbname[1]}.{tbname[2]}");
208-
sb.Append("use ").Append(_commonUtils.QuoteSqlName(tbname[0])).Append(";\r\nCREATE TABLE ").Append(createTableName).Append(" ( ");
207+
var createTableName = _commonUtils.QuoteSqlName(tbname[1], tbname[2]);
208+
sb.Append("use [").Append(tbname[0]).Append("];\r\nCREATE TABLE ").Append(createTableName).Append(" ( ");
209209
var pkidx = 0;
210210
foreach (var tbcol in tb.ColumnsByPosition)
211211
{
@@ -252,7 +252,7 @@ protected override string GetComparisonDDLStatements(params TypeAndName[] object
252252
//如果新表,旧表在一个数据库和模式下,直接修改表名
253253
if (string.Compare(tbname[0], tboldname[0], true) == 0 &&
254254
string.Compare(tbname[1], tboldname[1], true) == 0)
255-
sbalter.Append("use ").Append(_commonUtils.QuoteSqlName(tbname[0])).Append(_commonUtils.FormatSql(";\r\nEXEC sp_rename {0}, {1};\r\n", _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}.{tboldname[2]}"), tbname[2]));
255+
sbalter.Append("use [").Append(tbname[0]).Append(_commonUtils.FormatSql("];\r\nEXEC sp_rename {0}, {1};\r\n", _commonUtils.QuoteSqlName(tboldname[0], tboldname[1], tboldname[2]), tbname[2]));
256256
else
257257
{
258258
//如果新表,旧表不在一起,创建新表,导入数据,删除旧表
@@ -317,7 +317,7 @@ from sys.columns a
317317
continue;
318318
}
319319
//添加列
320-
sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbname[2]}")).Append(" ADD ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType);
320+
sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1], tbname[2])).Append(" ADD ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType);
321321
if (tbcol.Attribute.IsIdentity == true && tbcol.Attribute.DbType.IndexOf("identity", StringComparison.CurrentCultureIgnoreCase) == -1) sbalter.Append(" identity(1,1)");
322322
if (tbcol.Attribute.IsNullable == false && tbcol.DbDefaultValue != "NULL" && tbcol.Attribute.IsIdentity == false) sbalter.Append(" default(").Append(GetTransferDbDefaultValue(tbcol)).Append(")");
323323
sbalter.Append(";\r\n");
@@ -345,10 +345,10 @@ from sys.index_columns a
345345
var dsukfind1 = dsuk.Where(a => string.Compare(a[1], uk.Name, true) == 0).ToArray();
346346
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)
347347
{
348-
if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[1]}.{tbname[2]}")).Append(";\r\n");
348+
if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName(tbname[1], tbname[2])).Append(";\r\n");
349349
sbalter.Append("CREATE ");
350350
if (uk.IsUnique) sbalter.Append("UNIQUE ");
351-
sbalter.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[1]}.{tbname[2]}")).Append("(");
351+
sbalter.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName(tbname[1], tbname[2])).Append("(");
352352
foreach (var tbcol in uk.Columns)
353353
{
354354
sbalter.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));
@@ -361,18 +361,20 @@ from sys.index_columns a
361361
}
362362
if (istmpatler == false)
363363
{
364-
var dbcomment = string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, $" SELECT value from fn_listextendedproperty('MS_Description', 'schema', N'{tbname[1].Replace("'", "''")}', 'table', N'{tbname[2].Replace("'", "''")}', NULL, NULL)"));
364+
var dbcommentsql = $" SELECT value from fn_listextendedproperty('MS_Description', 'schema', N'{tbname[1].Replace("'", "''")}', 'table', N'{tbname[2].Replace("'", "''")}', NULL, NULL)";
365+
if (string.Compare(tbname[0], database, true) != 0) dbcommentsql = $"use [{tbname[0]}];{dbcommentsql};use [{database}];";
366+
var dbcomment = string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, dbcommentsql));
365367
if (dbcomment != (tb.Comment ?? ""))
366-
AddOrUpdateMS_Description(sb, tbname[1], tbname[2], tb.Comment);
368+
AddOrUpdateMS_Description(sbalter, tbname[1], tbname[2], tb.Comment);
367369

368370
if (sbalter.Length > 0)
369-
sb.Append(sbalter).Append("\r\nuse " + database);
371+
sb.Append($"use [{tbname[0]}];").Append(sbalter).Append("\r\nuse [").Append(database).Append("];");
370372
continue;
371373
}
372374
//创建临时表,数据导进临时表,然后删除原表,将临时表改名为原表名
373375
bool idents = false;
374-
var tablename = tboldname == null ? _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbname[2]}") : _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}.{tboldname[2]}");
375-
var tmptablename = _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.FreeSqlTmp_{tbname[2]}");
376+
var tablename = tboldname == null ? _commonUtils.QuoteSqlName(tbname[0], tbname[1], tbname[2]) : _commonUtils.QuoteSqlName(tboldname[0], tboldname[1], tboldname[2]);
377+
var tmptablename = _commonUtils.QuoteSqlName(tbname[0], tbname[1], $"FreeSqlTmp_{tbname[2]}");
376378
sb.Append("BEGIN TRANSACTION\r\n")
377379
.Append("SET QUOTED_IDENTIFIER ON\r\n")
378380
.Append("SET ARITHABORT ON\r\n")

Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,8 @@ protected override string GetComparisonDDLStatements(params TypeAndName[] object
203203
if (tboldname == null)
204204
{
205205
//创建表
206-
var createTableName = _commonUtils.QuoteSqlName($"{tbname[1]}.{tbname[2]}");
207-
sb.Append("use ").Append(_commonUtils.QuoteSqlName(tbname[0])).Append(";\r\nCREATE TABLE ").Append(createTableName).Append(" ( ");
206+
var createTableName = _commonUtils.QuoteSqlName(tbname[1], tbname[2]);
207+
sb.Append("use [").Append(tbname[0]).Append("];\r\nCREATE TABLE ").Append(createTableName).Append(" ( ");
208208
var pkidx = 0;
209209
foreach (var tbcol in tb.ColumnsByPosition)
210210
{
@@ -251,7 +251,7 @@ protected override string GetComparisonDDLStatements(params TypeAndName[] object
251251
//如果新表,旧表在一个数据库和模式下,直接修改表名
252252
if (string.Compare(tbname[0], tboldname[0], true) == 0 &&
253253
string.Compare(tbname[1], tboldname[1], true) == 0)
254-
sbalter.Append("use ").Append(_commonUtils.QuoteSqlName(tbname[0])).Append(_commonUtils.FormatSql(";\r\nEXEC sp_rename {0}, {1};\r\n", _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}.{tboldname[2]}"), tbname[2]));
254+
sbalter.Append("use [").Append(tbname[0]).Append(_commonUtils.FormatSql("];\r\nEXEC sp_rename {0}, {1};\r\n", _commonUtils.QuoteSqlName(tboldname[0], tboldname[1], tboldname[2]), tbname[2]));
255255
else
256256
{
257257
//如果新表,旧表不在一起,创建新表,导入数据,删除旧表
@@ -316,7 +316,7 @@ from sys.columns a
316316
continue;
317317
}
318318
//添加列
319-
sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbname[2]}")).Append(" ADD ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType);
319+
sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1], tbname[2])).Append(" ADD ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType);
320320
if (tbcol.Attribute.IsIdentity == true && tbcol.Attribute.DbType.IndexOf("identity", StringComparison.CurrentCultureIgnoreCase) == -1) sbalter.Append(" identity(1,1)");
321321
if (tbcol.Attribute.IsNullable == false && tbcol.DbDefaultValue != "NULL" && tbcol.Attribute.IsIdentity == false) sbalter.Append(" default(").Append(GetTransferDbDefaultValue(tbcol)).Append(")");
322322
sbalter.Append(";\r\n");
@@ -344,10 +344,10 @@ from sys.index_columns a
344344
var dsukfind1 = dsuk.Where(a => string.Compare(a[1], uk.Name, true) == 0).ToArray();
345345
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)
346346
{
347-
if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[1]}.{tbname[2]}")).Append(";\r\n");
347+
if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName(tbname[1], tbname[2])).Append(";\r\n");
348348
sbalter.Append("CREATE ");
349349
if (uk.IsUnique) sbalter.Append("UNIQUE ");
350-
sbalter.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[1]}.{tbname[2]}")).Append("(");
350+
sbalter.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName(tbname[1], tbname[2])).Append("(");
351351
foreach (var tbcol in uk.Columns)
352352
{
353353
sbalter.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));
@@ -360,18 +360,20 @@ from sys.index_columns a
360360
}
361361
if (istmpatler == false)
362362
{
363-
var dbcomment = string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, $" SELECT value from fn_listextendedproperty('MS_Description', 'schema', N'{tbname[1].Replace("'", "''")}', 'table', N'{tbname[2].Replace("'", "''")}', NULL, NULL)"));
363+
var dbcommentsql = $" SELECT value from fn_listextendedproperty('MS_Description', 'schema', N'{tbname[1].Replace("'", "''")}', 'table', N'{tbname[2].Replace("'", "''")}', NULL, NULL)";
364+
if (string.Compare(tbname[0], database, true) != 0) dbcommentsql = $"use [{tbname[0]}];{dbcommentsql};use [{database}];";
365+
var dbcomment = string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, dbcommentsql));
364366
if (dbcomment != (tb.Comment ?? ""))
365-
AddOrUpdateMS_Description(sb, tbname[1], tbname[2], tb.Comment);
367+
AddOrUpdateMS_Description(sbalter, tbname[1], tbname[2], tb.Comment);
366368

367369
if (sbalter.Length > 0)
368-
sb.Append(sbalter).Append("\r\nuse " + database);
370+
sb.Append($"use [{tbname[0]}];").Append(sbalter).Append("\r\nuse [").Append(database).Append("];");
369371
continue;
370372
}
371373
//创建临时表,数据导进临时表,然后删除原表,将临时表改名为原表名
372374
bool idents = false;
373-
var tablename = tboldname == null ? _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbname[2]}") : _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}.{tboldname[2]}");
374-
var tmptablename = _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.FreeSqlTmp_{tbname[2]}");
375+
var tablename = tboldname == null ? _commonUtils.QuoteSqlName(tbname[0], tbname[1], tbname[2]) : _commonUtils.QuoteSqlName(tboldname[0], tboldname[1], tboldname[2]);
376+
var tmptablename = _commonUtils.QuoteSqlName(tbname[0], tbname[1], $"FreeSqlTmp_{tbname[2]}");
375377
sb.Append("BEGIN TRANSACTION\r\n")
376378
.Append("SET QUOTED_IDENTIFIER ON\r\n")
377379
.Append("SET ARITHABORT ON\r\n")

0 commit comments

Comments
 (0)