diff --git a/XCode/DataAccessLayer/Database/SqlServer.cs b/XCode/DataAccessLayer/Database/SqlServer.cs index 7618ba7e4..fb4f3bb9a 100644 --- a/XCode/DataAccessLayer/Database/SqlServer.cs +++ b/XCode/DataAccessLayer/Database/SqlServer.cs @@ -764,7 +764,12 @@ private List GetParametersList(IDataColumn[] columns, ICollect var dt = val.ToDateTime(); if (dt.Year < 1970) val = new DateTime(1970, 1, 1); } - + //byte[]类型查询时候参数化异常 + else if (dc.DataType == typeof(Byte[])) + { + if (val == null) + val = new Byte[0]; + } // 逐列创建参数对象 dps.Add(db.CreateParameter(dc.Name, val, dc)); } diff --git a/XCode/DataAccessLayer/MetaData/DbMetaData_Positive.cs b/XCode/DataAccessLayer/MetaData/DbMetaData_Positive.cs index c48476564..6073b794d 100644 --- a/XCode/DataAccessLayer/MetaData/DbMetaData_Positive.cs +++ b/XCode/DataAccessLayer/MetaData/DbMetaData_Positive.cs @@ -4,6 +4,8 @@ using System.Data.Common; using System.Linq; using NewLife; +using NewLife.Log; +using NewLife.Serialization; using XCode.Common; using XCode.Exceptions; @@ -210,9 +212,17 @@ protected virtual List GetFields(IDataTable table, DataRow[] rows) // 原始数据类型 field.RawType = GetDataRowValue(dr, "DATA_TYPE", "DATATYPE", "COLUMN_DATA_TYPE"); + // 长度 field.Length = GetDataRowValue(dr, "CHARACTER_MAXIMUM_LENGTH", "LENGTH", "COLUMN_SIZE"); + //修复sqlserver同步到sqlserver建表长度为1的bug + var rawType = field.RawType.ToLower(); + if (rawType == "nvarchar" || rawType == "varchar" || rawType == "char" || rawType == "binary") + field.RawType += "(" + field.Length + ")"; + if (rawType == "varbinary" && field.Length == -1) + field.RawType = "varbinary(max)"; + if (field is XField fi) { // 精度 与 位数 @@ -221,6 +231,7 @@ protected virtual List GetFields(IDataTable table, DataRow[] rows) if (field.Length == 0) field.Length = fi.Precision; } + // 允许空 if (TryGetDataRowValue(dr, "IS_NULLABLE", out b)) field.Nullable = b; @@ -333,7 +344,7 @@ protected virtual List GetIndexes(IDataTable table, DataTable indexe protected IDictionary Types { get; set; } = null!; protected List>? _FieldTypeMaps; - /// 字段类型映射(数据库-实体类) + /// 字段类型映射 protected virtual List> FieldTypeMaps { get @@ -348,8 +359,6 @@ protected virtual List GetIndexes(IDataTable table, DataTable indexe // 因为等价,字节需要能够互相映射 new(typeof(Byte), typeof(SByte)), new(typeof(Byte), typeof(Boolean)), - new(typeof(Boolean), typeof(Byte)), - new(typeof(Byte), typeof(Int32)), new(typeof(UInt16), typeof(Int16)), new(typeof(Int16), typeof(UInt16)), @@ -368,7 +377,6 @@ protected virtual List GetIndexes(IDataTable table, DataTable indexe new(typeof(Int64), typeof(UInt64)), //list.Add(new KeyValuePair(typeof(UInt64), typeof(Int32))); //list.Add(new KeyValuePair(typeof(Int64), typeof(Int32))); - new(typeof(Int64), typeof(Int32)), // 数据库使用Double,实体类使用Decimal new(typeof(Double), typeof(Decimal)), @@ -411,6 +419,9 @@ protected virtual List GetIndexes(IDataTable table, DataTable indexe var typeName = ns.FirstOrDefault(); // 大文本选第二个类型 if (ns.Length > 1 && type == typeof(String) && (field.Length <= 0 || field.Length >= Database.LongTextLength)) typeName = ns[1]; + //mysql 转sqlserver + if (field.RawType.ToLower() == "longblob") + typeName = "varbinary(max)"; if (typeName.Contains("{0}")) { if (typeName.Contains("{1}")) diff --git a/XCode/Transform/TimeExtracter.cs b/XCode/Transform/TimeExtracter.cs index 2fdeda851..3401ceb6a 100644 --- a/XCode/Transform/TimeExtracter.cs +++ b/XCode/Transform/TimeExtracter.cs @@ -66,7 +66,9 @@ public virtual IEnumerable Fetch() // 分割数据页 var sb = Builder.Clone(); if (!sb.Where.IsNullOrEmpty()) sb.Where += " And "; - sb.Where += $"{name}.{db.FormatValue(field, StartTime)}"; + //修复拼接sql错误 + if (StartTime != null && StartTime > DateTime.MinValue) + sb.Where += $"{name}>{db.FormatValue(field, StartTime)}"; // 查询数据 var dt = Dal.Query(sb, 0, BatchSize); @@ -86,7 +88,8 @@ public virtual IEnumerable Fetch() { sb = Builder.Clone(); if (!sb.Where.IsNullOrEmpty()) sb.Where += " And "; - sb.Where += $"{name}>={db.FormatValue(field, StartTime)} And {name}<{db.FormatValue(field, StartTime.AddSeconds(1))}"; + //避免分页插入重复的一条数据 + sb.Where += $"{name}>{db.FormatValue(field, StartTime)} And {name}<{db.FormatValue(field, StartTime.AddSeconds(1))}"; // 查询数据,该时间点数据也可能有多页 var startRow = 0;