首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将C#类转换为SQL表

将C#类转换为SQL表
EN

Stack Overflow用户
提问于 2017-04-21 21:07:15
回答 1查看 13.3K关注 0票数 8

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

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

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

这就是我目前使用的方法,它使用SELECT到并将null转换为sqlType,以使列为空。如您所见,这是相当原始的,但主要是完成工作-我正在寻找较少的错误发生的方法。

代码语言:javascript
复制
        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#类中,并返回一个create语句。

EN

回答 1

Stack Overflow用户

发布于 2019-08-02 04:04:50

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

将C#类转换为Json:

将Json转换为SQL:

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43552033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档