sqlserver支持sql_variant类型

This commit is contained in:
智能大石头 2025-01-15 00:17:20 +08:00
parent 3df628a27d
commit d63e91f0fd
3 changed files with 47 additions and 4 deletions

View File

@ -611,7 +611,7 @@ public partial class DAL
private IList<IDataTable> GetTables()
{
if (Db is DbBase db2 && !db2.SupportSchema) return new List<IDataTable>();
if (Db is DbBase db2 && !db2.SupportSchema) return [];
var tracer = Tracer ?? GlobalTracer;
using var span = tracer?.NewSpan($"db:{ConnName}:GetTables", ConnName);
@ -634,7 +634,7 @@ public partial class DAL
/// <summary>
/// 获取所有表名,带缓存,不区分大小写
/// </summary>
public ICollection<String> TableNames => _cache.GetOrAdd("tableNames", k => new HashSet<String>(GetTableNames(), StringComparer.OrdinalIgnoreCase), 60) ?? new HashSet<String>();
public ICollection<String> TableNames => _cache.GetOrAdd("tableNames", k => new HashSet<String>(GetTableNames(), StringComparer.OrdinalIgnoreCase), 60) ?? [];
/// <summary>
/// 快速获取所有表名,无缓存,区分大小写
@ -735,7 +735,7 @@ public partial class DAL
}
}
internal List<String> HasCheckTables = new();
internal List<String> HasCheckTables = [];
/// <summary>检查是否已存在,如果不存在则添加</summary>
/// <param name="tableName"></param>
/// <returns></returns>

View File

@ -1690,7 +1690,7 @@ internal class SqlServerMetaData : RemoteDbMetaData
{ typeof(Double), new String[] { "float" } },
{ typeof(Decimal), new String[] { "money", "decimal({0}, {1})", "numeric({0}, {1})", "smallmoney" } },
{ typeof(DateTime), new String[] { "datetime", "smalldatetime", "datetime2({0})", "date" } },
{ typeof(String), new String[] { "nvarchar({0})", "ntext", "text", "varchar({0})", "char({0})", "nchar({0})", "xml" } }
{ typeof(String), new String[] { "nvarchar({0})", "ntext", "text", "varchar({0})", "char({0})", "nchar({0})", "xml", "sql_variant" } }
};
#region

View File

@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.IO;
using System.Linq;
using System.Threading;
@ -479,4 +481,45 @@ public class SqlServerTests
""";
Assert.Equal(targetSql, sql);
}
[Fact]
public void GetTables()
{
DAL.AddConnStr("sysSqlServer", _ConnStr, null, "SqlServer");
var dal = DAL.Create("sysSqlServer");
var dbprovider = dal.DbType.ToString();
var builder = new DbConnectionStringBuilder
{
ConnectionString = dal.ConnStr
};
var dt = dal.Db.CreateSession().GetSchema(null, "Databases", null);
var sysdbnames = new String[] { "master", "tempdb", "model", "msdb" };
foreach (DataRow dr in dt.Rows)
{
var dbname = dr[0].ToString();
if (Array.IndexOf(sysdbnames, dbname) >= 0) continue;
var connName = String.Format("{0}_{1}", "ms", dbname);
builder["Database"] = dbname;
var connstr = builder.ToString();
DAL.AddConnStr(connName, connstr, null, dbprovider);
try
{
var dal2 = DAL.Create(connName);
var tables = dal2.Tables;
XTrace.WriteLine("数据库{0}有表{1}张", dbname, tables.Count);
var xml = DAL.Export(tables);
File.WriteAllText($"data\\{connName}.xml".GetFullPath(), xml);
}
catch
{
if (DAL.ConnStrs.ContainsKey(connName)) DAL.ConnStrs.Remove(connName);
}
}
}
}