如何从填充 DataTable 的 SELECT 中获取 SQL Server 上的原始架构?

Posted

技术标签:

【中文标题】如何从填充 DataTable 的 SELECT 中获取 SQL Server 上的原始架构?【英文标题】:How to get the original schema on SQL Server from SELECT that fills DataTable? 【发布时间】:2018-05-25 02:33:57 【问题描述】:

我有以下辅助函数,用于基于 SQL SELECT 对 SQL Server 数据库加载DataTable(有点简化):

static private DataTable GetData_(string connectionString, string sqlSelect, bool doFillSchema = false)

    using (SqlConnection connection = new SqlConnection(connectionString))
    using (SqlDataAdapter adapter = new SqlDataAdapter(sqlSelect, connection))
    
        DataTable table = new DataTable();

        if (doFillSchema)
            adapter.FillSchema(table, SchemaType.Mapped);

        adapter.Fill(table);
        return table;
    

后面的目标是将返回的table 传递给另一个函数,该函数应该将内容导出到 DBF 表中(即 CREATE TABLE 并写入与引擎的不同功能相关的一些更正的内容)。

问题在于该实现将架构中的原始say numeric(10, 2) 列类型更改为Decimal。我想保留原件。

如果我理解得很好,我可能需要使用原始模式获取另一个 DataTable schemaTable(在适配器更改列类型之前)。我的想法是像这样修改函数:

static private DataTable GetData_(string connectionString, string sqlSelect,
                                  bool doFillSchema, ref DataTable schemaTable)

    using (SqlConnection connection = new SqlConnection(connectionString))
    using (SqlDataAdapter adapter = new SqlDataAdapter(sqlSelect, connection))
    
        DataTable table = new DataTable();

        if (doFillSchema)
            ??? fill the schema table

        adapter.Fill(table);
        return table;
    

该功能应该如何实现? SqlDataAdapter 是否应该用于此目的?还是应该换一种方式?

【问题讨论】:

【参考方案1】:

好吧,我有这个自我回答。如果您有更好的解决方案,我将很乐意接受。 ;)

static private DataTable GetData_(string connectionString, string sqlSelect, Hashtable arg,
                                  bool doFillSchema, ref DataTable schemaTable)

    using (SqlConnection connection = new SqlConnection(connectionString))
    using (SqlCommand command = new SqlCommand(sqlSelect, connection))
    
        connection.Open();

        // If we want the schema, do the extra step.
        if (doFillSchema)
        
            using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo))
                schemaTable = reader.GetSchemaTable();
        

        // Use the adapter to fill the result table..
        using (SqlDataAdapter adapter = new SqlDataAdapter(command))
        
            DataTable table = new DataTable();

            // Set the SELECT arguments.
            if (arg != null)
            
                foreach (DictionaryEntry item in arg)
                
                    adapter.SelectCommand.Parameters.AddWithValue(item.Key.ToString(), item.Value);
                
            

            // Get the result of the SQL query.
            adapter.Fill(table);
            return table;
        
    

【讨论】:

以上是关于如何从填充 DataTable 的 SELECT 中获取 SQL Server 上的原始架构?的主要内容,如果未能解决你的问题,请参考以下文章

SQLite SELECT查询中的自定义字段填充后不会成为DataTable中的DateTime列?

从 DataTable 填充 TreeView

动态 Linq 查询 - 如何构建 select 子句?

无法从 DataTable 中选择 DataRow

jQuery DataTable 从搜索中重新填充表

如何从 DataTable 中提取数据?