从 SQL Server 检索列名称和类型到 DataTable C#

Tur*_*uro 1 c# datatable ado.net

基于 SQL Server 中现有表构建空 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;
}
Run Code Online (Sandbox Code Playgroud)

我今天读到了有关模式的内容,这对于这项任务来说似乎很自然。这让我比我想象的更加困惑。无论如何,下面的这种方法返回一个数据表,返回有关数据集的广泛信息,但我没有找到访问器来获取有关有趣的数据表的信息(如下)。也许我做错了什么。

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我也可以尝试使用 DataAdapter 读取数据,然后填充数据(基本上是复制 DataTable),然后删除所有行以使表为空的方法 - 但这肯定会影响性能。什么是正确的解决方案?

Gla*_*iar 5

您可以使用 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

而且,我建议您也对命令和适配器使用“using”