gpt4 book ai didi

c# - 将 C# 类转换为 SQL 表

转载 作者:太空宇宙 更新时间:2023-11-03 15:05:57 27 4
gpt4 key购买 nike

我能找到的唯一引用是某人 suggesting to use Entity Framework这样做,但我没有或使用 Entity Framework 。关于这个主题的唯一另一件事是从 SQL 表到 C# 类,这与我想要的相反。

这不一定是 TSQL/MSSQL (2014) 兼容,但这是我的 DBMS。

C# 类只是一个 POCO。我想我听说您可以上课并以某种方式将其转换为 DataTable,然后使用 SqlBulkCopy 让它从 DataTable 创建一个表。

这就是我目前正在使用的,它使用 SELECT INTO 并将 null 转换为 sqlType 以生成可为空的列。如您所见,它非常原始,但大部分工作都已完成 - 我正在寻找不易出错的方法。

        var columnNames = GetColumnsToBeUpdated<T>().ToList();
var columnTypes = GetColumnsTypesToBeUpdated<T>().ToList();


var selects = columnNames.Select((t, i) => $"CAST(NULL as {columnTypes[i]}) AS [{t}]");

var createsql = $@"
SELECT {string.Join(", ", selects)}
INTO SDE.[{tableName}]";

using (var connection = new SqlConnection(_sdeConnectionString))
{
EsriServer.ExecuteNonQuery(connection, $"IF OBJECT_ID(N'SDE.[{tableName}]', N'U') IS NOT NULL " +
$"DROP TABLE SDE.[{tableName}]", null);
EsriServer.ExecuteNonQuery(connection, createsql, null);
EsriServer.ExecuteNonQuery(connection, $"TRUNCATE TABLE SDE.[{tableName}]", null);
}

private static string GetSqlDataType(Type type)
{
var name = type.Name;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
name = type.GetGenericArguments()[0].Name;
}

switch (name)
{
case "Guid":
return "uniqueidentifier";
case "Boolean":
return "bit";
case "Byte":
return "tinyint";
case "Int16":
return "smallint";
case "Int32":
return "int";
case "Int64":
return "bigint";
case "Decimal":
return "decimal(38,25)";
case "Single":
return "real";
case "Double":
return "float";
case "DateTime":
return "datetime";
case "String":
case "Char[]":
return "nvarchar(max)";
case "Char":
return "nvarchar(1)";
case "Byte[]":
return "varbinary";
case "Object":
return "sql_variant";
default:
throw new ArgumentOutOfRangeException();
}
}

private static IEnumerable<string> GetColumnsToBeUpdated<T>() where T : class, new()
{
var typeT = new T();
var ps = typeT.GetType().GetProperties();
var propertyNames = ps.Select(p => p.Name);

return propertyNames.Except(GetColumnsToBeIgnored<T>());
}

private static IEnumerable<string> GetColumnsTypesToBeUpdated<T>() where T : class, new()
{
var typeT = new T();
var ps = typeT.GetType().GetProperties();
return ps.Select(p => p.PropertyType).Select(GetSqlDataType).ToList();
}

如果这不能准确完成或需要主要代码,那么我可以使用允许我粘贴简单 C# 类并返回创建表语句的应用程序或在线服务器。

最佳答案

您可以将C# 类转换为Json,然后将Json 转换为Sql

将 C# 类转换为 Json:

在线将Json转SQL:

关于c# - 将 C# 类转换为 SQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43552033/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com