- 修复 SqlServer DbFirst、CodeFirst 查询实体表的列信息错误,当设置了表/列多个扩展属性时发生;

- 修复 SqlServer2005 CodeFirst 迁移时,不支持 SET (LOCK_ESCALATION TABLE) 的错误(已做适配);
- 修复 SqlServer2005 批量插入SQL语法错误,不支持 Values(),()(已做适配);
- 完善 SqlServer2005 环境跑通了所有单元测试;
This commit is contained in:
28810
2019-11-19 00:38:34 +08:00
parent acd406164a
commit d6010b4b51
34 changed files with 598 additions and 480 deletions

View File

@ -4,6 +4,7 @@ using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@ -21,9 +22,34 @@ namespace FreeSql.SqlServer.Curd
public override long ExecuteIdentity() => base.SplitExecuteIdentity(1000, 2100);
public override List<T1> ExecuteInserted() => base.SplitExecuteInserted(1000, 2100);
protected override int RawExecuteAffrows()
{
var versionGreaterThan10 = (_commonUtils as SqlServerUtils).ServerVersion > 10;
var sql = versionGreaterThan10 ? this.ToSql() : this.ToSqlValuesOrSelectUnionAll(false);
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params);
_orm.Aop.CurdBefore?.Invoke(this, before);
var affrows = 0;
Exception exception = null;
try
{
affrows = _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, _params);
}
catch (Exception ex)
{
exception = ex;
throw ex;
}
finally
{
var after = new Aop.CurdAfterEventArgs(before, exception, affrows);
_orm.Aop.CurdAfter?.Invoke(this, after);
}
return affrows;
}
protected override long RawExecuteIdentity()
{
var sql = this.ToSql();
var versionGreaterThan10 = (_commonUtils as SqlServerUtils).ServerVersion > 10;
var sql = versionGreaterThan10 ? this.ToSql() : this.ToSqlValuesOrSelectUnionAll(false);
if (string.IsNullOrEmpty(sql)) return 0;
sql = string.Concat(sql, "; SELECT SCOPE_IDENTITY();");
@ -49,7 +75,8 @@ namespace FreeSql.SqlServer.Curd
}
protected override List<T1> RawExecuteInserted()
{
var sql = this.ToSql();
var versionGreaterThan10 = (_commonUtils as SqlServerUtils).ServerVersion > 10;
var sql = versionGreaterThan10 ? this.ToSql(): this.ToSqlValuesOrSelectUnionAll(false);
if (string.IsNullOrEmpty(sql)) return new List<T1>();
var sb = new StringBuilder();
@ -62,10 +89,20 @@ namespace FreeSql.SqlServer.Curd
++colidx;
}
var validx = sql.IndexOf(") VALUES");
if (validx == -1) throw new ArgumentException("找不到 VALUES");
sb.Insert(0, sql.Substring(0, validx + 1));
sb.Append(sql.Substring(validx + 1));
if (versionGreaterThan10)
{
var validx = sql.IndexOf(") VALUES");
if (validx == -1) throw new ArgumentException("找不到 VALUES");
sb.Insert(0, sql.Substring(0, validx + 1));
sb.Append(sql.Substring(validx + 1));
}
else
{
var validx = sql.IndexOf(") SELECT ");
if (validx == -1) throw new ArgumentException("找不到 SELECT");
sb.Insert(0, sql.Substring(0, validx + 1));
sb.Append(sql.Substring(validx + 1));
}
sql = sb.ToString();
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params);
@ -95,9 +132,34 @@ namespace FreeSql.SqlServer.Curd
public override Task<long> ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(1000, 2100);
public override Task<List<T1>> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(1000, 2100);
async protected override Task<int> RawExecuteAffrowsAsync()
{
var versionGreaterThan10 = (_commonUtils as SqlServerUtils).ServerVersion > 10;
var sql = versionGreaterThan10 ? this.ToSql() : this.ToSqlValuesOrSelectUnionAll(false);
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params);
_orm.Aop.CurdBefore?.Invoke(this, before);
var affrows = 0;
Exception exception = null;
try
{
affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, _params);
}
catch (Exception ex)
{
exception = ex;
throw ex;
}
finally
{
var after = new Aop.CurdAfterEventArgs(before, exception, affrows);
_orm.Aop.CurdAfter?.Invoke(this, after);
}
return affrows;
}
async protected override Task<long> RawExecuteIdentityAsync()
{
var sql = this.ToSql();
var versionGreaterThan10 = (_commonUtils as SqlServerUtils).ServerVersion > 10;
var sql = versionGreaterThan10 ? this.ToSql() : this.ToSqlValuesOrSelectUnionAll(false);
if (string.IsNullOrEmpty(sql)) return 0;
sql = string.Concat(sql, "; SELECT SCOPE_IDENTITY();");
@ -123,7 +185,8 @@ namespace FreeSql.SqlServer.Curd
}
async protected override Task<List<T1>> RawExecuteInsertedAsync()
{
var sql = this.ToSql();
var versionGreaterThan10 = (_commonUtils as SqlServerUtils).ServerVersion > 10;
var sql = versionGreaterThan10 ? this.ToSql() : this.ToSqlValuesOrSelectUnionAll(false);
if (string.IsNullOrEmpty(sql)) return new List<T1>();
var sb = new StringBuilder();
@ -136,10 +199,20 @@ namespace FreeSql.SqlServer.Curd
++colidx;
}
var validx = sql.IndexOf(") VALUES");
if (validx == -1) throw new ArgumentException("找不到 VALUES");
sb.Insert(0, sql.Substring(0, validx + 1));
sb.Append(sql.Substring(validx + 1));
if (versionGreaterThan10)
{
var validx = sql.IndexOf(") VALUES");
if (validx == -1) throw new ArgumentException("找不到 VALUES");
sb.Insert(0, sql.Substring(0, validx + 1));
sb.Append(sql.Substring(validx + 1));
}
else
{
var validx = sql.IndexOf(") SELECT ");
if (validx == -1) throw new ArgumentException("找不到 SELECT");
sb.Insert(0, sql.Substring(0, validx + 1));
sb.Append(sql.Substring(validx + 1));
}
sql = sb.ToString();
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params);

View File

@ -109,27 +109,29 @@ ELSE
protected override string GetComparisonDDLStatements(params (Type entityType, string tableName)[] objects)
{
var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5));
var database = conn.Value.Database;
Func<string, string, object> ExecuteScalar = (db, sql) =>
{
if (string.Compare(database, db) != 0) conn.Value.ChangeDatabase(db);
try
{
using (var cmd = conn.Value.CreateCommand())
{
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
return cmd.ExecuteScalar();
}
}
finally
{
if (string.Compare(database, db) != 0) conn.Value.ChangeDatabase(database);
}
};
var sb = new StringBuilder();
string database = null;
try
{
database = conn.Value.Database;
Func<string, string, object> ExecuteScalar = (db, sql) =>
{
if (string.Compare(database, db) != 0) conn.Value.ChangeDatabase(db);
try
{
using (var cmd = conn.Value.CreateCommand())
{
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
return cmd.ExecuteScalar();
}
}
finally
{
if (string.Compare(database, db) != 0) conn.Value.ChangeDatabase(database);
}
};
var sb = new StringBuilder();
foreach (var obj in objects)
{
if (sb.Length > 0) sb.Append("\r\n");
@ -246,10 +248,9 @@ a.name 'Column'
else '' end as 'SqlType'
,case when a.is_nullable = 1 then '1' else '0' end 'IsNullable'
,case when a.is_identity = 1 then '1' else '0' end 'IsIdentity'
,c.value
,(select value from sys.extended_properties where major_id = a.object_id AND minor_id = a.column_id AND name = 'MS_Description') 'Comment'
from sys.columns a
inner join sys.types b on b.user_type_id = a.user_type_id
left join sys.extended_properties AS c ON c.major_id = a.object_id AND c.minor_id = a.column_id
left join sys.tables d on d.object_id = a.object_id
left join sys.schemas e on e.schema_id = d.schema_id
where a.object_id in (object_id(N'[{1}].[{2}]'));
@ -380,7 +381,8 @@ use " + database, tboldname ?? tbname);
if (string.IsNullOrEmpty(tbcol.Comment) == false)
AddOrUpdateMS_Description(sb, tbname[1], $"FreeSqlTmp_{tbname[2]}", tbcol.Attribute.Name, tbcol.Comment);
}
sb.Append("ALTER TABLE ").Append(tmptablename).Append(" SET (LOCK_ESCALATION = TABLE);\r\n");
if ((_commonUtils as SqlServerUtils).ServerVersion > 9) //SqlServer 2008+
sb.Append("ALTER TABLE ").Append(tmptablename).Append(" SET (LOCK_ESCALATION = TABLE);\r\n");
if (idents) sb.Append("SET IDENTITY_INSERT ").Append(tmptablename).Append(" ON;\r\n");
sb.Append("IF EXISTS(SELECT 1 FROM ").Append(tablename).Append(")\r\n");
sb.Append("\tEXEC('INSERT INTO ").Append(tmptablename).Append(" (");
@ -429,7 +431,8 @@ use " + database, tboldname ?? tbname);
{
try
{
conn.Value.ChangeDatabase(database);
if (string.IsNullOrEmpty(database) == false)
conn.Value.ChangeDatabase(database);
_orm.Ado.MasterPool.Return(conn);
}
catch

View File

@ -133,32 +133,29 @@ select
a.Object_id
,b.name 'Owner'
,a.name 'Name'
,c.value
,(select value from sys.extended_properties where major_id = a.object_id AND minor_id = 0 AND name = 'MS_Description') 'Comment'
,'TABLE' type
from sys.tables a
inner join sys.schemas b on b.schema_id = a.schema_id
left join sys.extended_properties AS c ON c.major_id = a.object_id AND c.minor_id = 0 AND c.name = 'MS_Description'
where not(b.name = 'dbo' and a.name = 'sysdiagrams')
union all
select
a.Object_id
,b.name 'Owner'
,a.name 'Name'
,c.value
,(select value from sys.extended_properties where major_id = a.object_id AND minor_id = 0 AND name = 'MS_Description') 'Comment'
,'VIEW' type
from sys.views a
inner join sys.schemas b on b.schema_id = a.schema_id
left join sys.extended_properties AS c ON c.major_id = a.object_id AND c.minor_id = 0 AND c.name = 'MS_Description'
union all
select
a.Object_id
,b.name 'Owner'
,a.name 'Name'
,c.value
,(select value from sys.extended_properties where major_id = a.object_id AND minor_id = 0 AND name = 'MS_Description') 'Comment'
,'StoreProcedure' type
from sys.procedures a
inner join sys.schemas b on b.schema_id = a.schema_id
left join sys.extended_properties AS c ON c.major_id = a.object_id AND c.minor_id = 0 AND c.name = 'MS_Description'
where a.type = 'P' and charindex('diagram', a.name) = 0
order by type desc, b.name, a.name
;
@ -244,10 +241,9 @@ isnull(e.name,'') + '.' + isnull(d.name,'')
else cast(a.max_length as varchar) end + ')'
when b.name in ('Numeric', 'Decimal') then '(' + cast(a.precision as varchar) + ',' + cast(a.scale as varchar) + ')'
else '' end as 'SqlType'
,c.value
,(select value from sys.extended_properties where major_id = a.object_id AND minor_id = a.column_id AND name = 'MS_Description') 'Comment'
{0} a
inner join sys.types b on b.user_type_id = a.user_type_id
left join sys.extended_properties AS c ON c.major_id = a.object_id AND c.minor_id = a.column_id
left join sys.tables d on d.object_id = a.object_id
left join sys.schemas e on e.schema_id = d.schema_id
where {1}
@ -260,8 +256,8 @@ from sys.columns", loc8.ToString().Replace("a.table_name", "a.object_id"));
{
sql += "union all" +
string.Format(tsql_place.Replace(
"left join sys.extended_properties AS c ON c.major_id = a.object_id AND c.minor_id = a.column_id",
"left join sys.extended_properties AS c ON c.major_id = a.object_id AND c.minor_id = a.parameter_id"), @"
"select value from sys.extended_properties where major_id = a.object_id AND minor_id = a.column_id",
"select value from sys.extended_properties where major_id = a.object_id AND minor_id = a.parameter_id"), @"
,cast(0 as bit) 'IsNullable'
,a.is_output 'IsIdentity'
from sys.parameters", loc88.ToString().Replace("a.table_name", "a.object_id"));

View File

@ -43,7 +43,7 @@ namespace FreeSql.SqlServer
{
try
{
(this.InternalCommonUtils as SqlServerUtils).IsSelectRowNumber = int.Parse(conn.Value.ServerVersion.Split('.')[0]) <= 10;
(this.InternalCommonUtils as SqlServerUtils).ServerVersion = int.Parse(conn.Value.ServerVersion.Split('.')[0]);
}
catch
{

View File

@ -17,7 +17,9 @@ namespace FreeSql.SqlServer
{
}
public bool IsSelectRowNumber = true;
public bool IsSelectRowNumber => ServerVersion <= 10;
public bool IsSqlServer2005 => ServerVersion == 9;
public int ServerVersion = 0;
public override DbParameter AppendParamter(List<DbParameter> _params, string parameterName, Type type, object value)
{