将 C# 类转换为 SQL 表

Lea*_*Dev 8 c# t-sql sql-server

我能找到的唯一参考是有人建议使用实体框架来做到这一点,但我没有或使用实体框架。关于这个主题的唯一另一件事是从 SQL 表转到 C# 类,这与我想要的相反。

这不必与 TSQL/MSSQL (2014) 兼容,但那是我的 DBMS。

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

这就是我目前正在使用的,它使用 SELECT INTO 并将空值转换为 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();
    }
Run Code Online (Sandbox Code Playgroud)

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

sto*_*omy 9

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

将 C# 类转换为 Json:

在线将 Json 转换为 SQL: