从 SQL 服务器检索列名称和类型到 DataTable C#
Retrieve column names and types from SQL Server to DataTable C#
根据 SQL 服务器中现有的 table 构建空 DataTable 的最佳方法是什么?我目前的尝试是这个,它只是手动重新输入这个,所以它不是很好,特别是对于大数据集。
private DataTable createEmptyReadingDataTableReadyToSaveToDb()
{
dtbl.Columns.Add("ProductId", typeof(string));
dtbl.Columns.Add("Price", typeof(float));
dtbl.Columns.Add("Revenue", typeof(float));
dtbl.Columns.Add("URL", typeof(string));
// etc ....
return dtbl;
}
我今天读到关于模式的内容,这对于这项任务来说似乎很自然。这让我比我想象的更困惑。无论如何,下面的这种方法 returns 数据 table 返回有关数据集的广泛信息集,但我没有找到访问器来获取有关有趣的 DataTable 的信息(如下)。可能是我做错了。
private static DataTable getReadingTableFromSchema()
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalDbConnnectionString"].ConnectionString))
{
string sql = "SELECT * FROM [Readings]";
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader reader = cmd.ExecuteReader();
DataTable dtbl = reader.GetSchemaTable();
return dtbl;
}
}
我也可以尝试使用 DataAdapter 读取数据的方法,然后填充它(基本上是复制 DataTable),然后删除所有行以使 table 为空 - 但这肯定会影响性能。什么是正确的解决方案?
您可以使用 DataAdapter 并使用完整架构填充 DataTable:
private static DataTable getReadingTableFromSchema()
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalDbConnnectionString"].ConnectionString))
{
string sql = "SELECT * FROM [Readings]";
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
DbDataAdapter da = new SqlDataAdapter(cmd);
DataTable dtbl = new DataTable();
da.FillSchema(dtbl, SchemaType.Source);
return dtbl;
}
}
而且,我建议您也对命令和适配器使用 "using"
使用一点 LINQ
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalDbConnnectionString"].ConnectionString))
{
conn.Open();
using (var reader = new SqlCommand("SELECT * FROM [Readings] WHERE 1 = 0", conn).ExecuteReader())
{
var dataColumns = Enumerable.Range(0, reader.FieldCount)
.Select(i => new DataColumn(reader.GetName(i), reader.GetFieldType(i)))
.ToArray();
var dataTable = new DataTable("Readings");
dataTable.Columns.AddRange(dataColumns);
}
}
根据 SQL 服务器中现有的 table 构建空 DataTable 的最佳方法是什么?我目前的尝试是这个,它只是手动重新输入这个,所以它不是很好,特别是对于大数据集。
private DataTable createEmptyReadingDataTableReadyToSaveToDb()
{
dtbl.Columns.Add("ProductId", typeof(string));
dtbl.Columns.Add("Price", typeof(float));
dtbl.Columns.Add("Revenue", typeof(float));
dtbl.Columns.Add("URL", typeof(string));
// etc ....
return dtbl;
}
我今天读到关于模式的内容,这对于这项任务来说似乎很自然。这让我比我想象的更困惑。无论如何,下面的这种方法 returns 数据 table 返回有关数据集的广泛信息集,但我没有找到访问器来获取有关有趣的 DataTable 的信息(如下)。可能是我做错了。
private static DataTable getReadingTableFromSchema()
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalDbConnnectionString"].ConnectionString))
{
string sql = "SELECT * FROM [Readings]";
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader reader = cmd.ExecuteReader();
DataTable dtbl = reader.GetSchemaTable();
return dtbl;
}
}
我也可以尝试使用 DataAdapter 读取数据的方法,然后填充它(基本上是复制 DataTable),然后删除所有行以使 table 为空 - 但这肯定会影响性能。什么是正确的解决方案?
您可以使用 DataAdapter 并使用完整架构填充 DataTable:
private static DataTable getReadingTableFromSchema()
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalDbConnnectionString"].ConnectionString))
{
string sql = "SELECT * FROM [Readings]";
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
DbDataAdapter da = new SqlDataAdapter(cmd);
DataTable dtbl = new DataTable();
da.FillSchema(dtbl, SchemaType.Source);
return dtbl;
}
}
而且,我建议您也对命令和适配器使用 "using"
使用一点 LINQ
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalDbConnnectionString"].ConnectionString))
{
conn.Open();
using (var reader = new SqlCommand("SELECT * FROM [Readings] WHERE 1 = 0", conn).ExecuteReader())
{
var dataColumns = Enumerable.Range(0, reader.FieldCount)
.Select(i => new DataColumn(reader.GetName(i), reader.GetFieldType(i)))
.ToArray();
var dataTable = new DataTable("Readings");
dataTable.Columns.AddRange(dataColumns);
}
}