将C#类转换为SQL表格

8
我能找到的唯一参考资料是有人建议使用Entity Framework来完成这个任务,但我没有或不使用Entity Framework。在这个主题上唯一的其他事情是从SQL表到C#类,这与我想要的相反。
这不必是TSQL/MSSQL(2014)兼容的,但这是我的数据库管理系统。
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#类,并得到一个创建表语句。

探索如何将简单类型映射到全新的数据库表是相当平凡的任务。但如何处理 1) 已经存在数据的表格 2) 同步你的类和表格 3) 部署你的结构到各种环境 4) 处理不易映射的 POCO 5) 处理各种数据库约束,这些才是这个问题不切实际的原因。也许你应该考虑使用 NoSQL。 - Conrad Frix
  1. 这可以轻松成为创建者的输入
  2. 不需要
  3. 不需要
  4. 不是必需的,只需要简单的pocos即可
  5. C#尽力而为,如果SQL无法做到,则无法做到。
我不是在寻找企业解决方案,而是希望能够直接明了、易于阅读,同时仍然具有功能性。
- LearningJrDev
我认为你没有理解我的观点。解决微不足道的情况是不值得的。 - Conrad Frix
1个回答

11

cshar2json.io和sqlify.io存在证书问题。https://www.jsonutils.com/返回404错误。 - Luuk
用于将C#转换为JSON的工作网站:https://class2json.net/,用于将JSON转换为Sql的工作网站:https://www.convertjson.com/json-to-sql.htm - nmariot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接