From 4141c1cc376795c8f162420a3a88cdec68cd4d59 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 14 May 2022 17:23:35 +0800 Subject: [PATCH] SqlService support XElement --- .../SqlServerTest/UnitTest/UCodeFirst.cs | 14 +++++++++++++ .../IDataReaderEntityBuilder.cs | 21 +++++++++++++++++++ .../DbBindProvider/IDataRecordExtensions.cs | 7 +++++++ .../SqlServer/SqlServerProvider.cs | 13 +++++++++--- 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/Src/Asp.Net/SqlServerTest/UnitTest/UCodeFirst.cs b/Src/Asp.Net/SqlServerTest/UnitTest/UCodeFirst.cs index f760723e2..03e9520ff 100644 --- a/Src/Asp.Net/SqlServerTest/UnitTest/UCodeFirst.cs +++ b/Src/Asp.Net/SqlServerTest/UnitTest/UCodeFirst.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Xml.Linq; namespace OrmTest { @@ -78,8 +79,21 @@ namespace OrmTest Db.CodeFirst.InitTables(); Db.CodeFirst.InitTables(); db.CodeFirst.InitTables(); + db.CodeFirst.InitTables(); + db.Insertable(new UnitXml() + { + name= XElement.Parse("aa") + }).ExecuteCommand(); + var list= db.Queryable().ToList(); } + public class UnitXml + { + [SugarColumn(ColumnDataType ="xml")] + public XElement name { get; set; } + [SugarColumn(IsNullable =true)] + public string name2 { get; set; } + } public class UnitCodeFirst131 { public int Id { get; set; } diff --git a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs index 74e15db99..1d064442f 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs @@ -6,6 +6,7 @@ using System.Data; using System.Reflection; using System.Reflection.Emit; using System.Text.RegularExpressions; +using System.Xml.Linq; namespace SqlSugar { @@ -41,6 +42,7 @@ namespace SqlSugar private static readonly MethodInfo getdatetimeoffset = typeof(IDataRecordExtensions).GetMethod("Getdatetimeoffset"); private static readonly MethodInfo getdatetimeoffsetDate = typeof(IDataRecordExtensions).GetMethod("GetdatetimeoffsetDate"); private static readonly MethodInfo getStringGuid = typeof(IDataRecordExtensions).GetMethod("GetStringGuid"); + private static readonly MethodInfo getXelement = typeof(IDataRecordExtensions).GetMethod("GetXelement"); private static readonly MethodInfo getConvertStringGuid = typeof(IDataRecordExtensions).GetMethod("GetConvertStringGuid"); private static readonly MethodInfo getEnum = typeof(IDataRecordExtensions).GetMethod("GetEnum"); private static readonly MethodInfo getConvertString = typeof(IDataRecordExtensions).GetMethod("GetConvertString"); @@ -182,6 +184,21 @@ namespace SqlSugar generator.Emit(OpCodes.Callvirt, columnInfo.PropertyInfo.GetSetMethod(true)); generator.MarkLabel(endIfLabel); } + else if (columnInfo.UnderType == typeof(XElement)) + { + int i = DataRecord.GetOrdinal(fieldName); + Label endIfLabel = generator.DefineLabel(); + generator.Emit(OpCodes.Ldarg_0); + generator.Emit(OpCodes.Ldc_I4, i); + generator.Emit(OpCodes.Callvirt, isDBNullMethod); + generator.Emit(OpCodes.Brtrue, endIfLabel); + generator.Emit(OpCodes.Ldloc, result); + generator.Emit(OpCodes.Ldarg_0); + generator.Emit(OpCodes.Ldc_I4, i); + BindMethod(generator, columnInfo, i); + generator.Emit(OpCodes.Callvirt, columnInfo.PropertyInfo.GetSetMethod(true)); + generator.MarkLabel(endIfLabel); + } } private void BindField(ILGenerator generator, LocalBuilder result, EntityColumnInfo columnInfo, string fieldName) { @@ -285,6 +302,10 @@ namespace SqlSugar { method = isNullableType ? getConvertStringGuid : getStringGuid; } + else if (bindProperyTypeName == "xelement") + { + method = getXelement; + } break; case CSharpDataType.DateTime: CheckType(bind.DateThrow, bindProperyTypeName, validPropertyName, propertyName); diff --git a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataRecordExtensions.cs b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataRecordExtensions.cs index 9e27fc12d..829790f45 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataRecordExtensions.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataRecordExtensions.cs @@ -3,12 +3,19 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; +using System.Xml.Linq; + namespace SqlSugar { public static partial class IDataRecordExtensions { #region Common Extensions + public static XElement GetXelement(this IDataRecord dr, int i) + { + var result = XElement.Parse(dr.GetString(i).ToString()); + return result; + } public static Guid GetStringGuid(this IDataRecord dr, int i) { var result = Guid.Parse(dr.GetValue(i).ToString()); diff --git a/Src/Asp.Net/SqlSugar/Realization/SqlServer/SqlServerProvider.cs b/Src/Asp.Net/SqlSugar/Realization/SqlServer/SqlServerProvider.cs index 96d15fdf4..994eff8a6 100644 --- a/Src/Asp.Net/SqlSugar/Realization/SqlServer/SqlServerProvider.cs +++ b/Src/Asp.Net/SqlSugar/Realization/SqlServer/SqlServerProvider.cs @@ -6,6 +6,8 @@ using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Xml.Linq; + namespace SqlSugar { public class SqlServerProvider : AdoProvider @@ -131,10 +133,15 @@ namespace SqlSugar sqlParameter.Value = parameter.Value; sqlParameter.DbType = parameter.DbType; var isTime = parameter.DbType == System.Data.DbType.Time; - if (isTime) + if (isTime) { - sqlParameter.SqlDbType = SqlDbType.Time; - sqlParameter.Value=DateTime.Parse(parameter.Value?.ToString()).TimeOfDay; + sqlParameter.SqlDbType = SqlDbType.Time; + sqlParameter.Value = DateTime.Parse(parameter.Value?.ToString()).TimeOfDay; + } + else if (parameter.Value!=null&¶meter.Value is XElement) + { + sqlParameter.SqlDbType = SqlDbType.Xml; + sqlParameter.Value= (parameter.Value as XElement).ToString(); } if (sqlParameter.Value!=null&& sqlParameter.Value != DBNull.Value && sqlParameter.DbType == System.Data.DbType.DateTime) {