如何从填充 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 上的原始架构?的主要内容,如果未能解决你的问题,请参考以下文章