簡體   English   中英

從SQL Server到DataTable C#檢索列名和類型

[英]Retrieve column names and types from SQL Server to DataTable C#

在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;
}

今天,我閱讀了有關架構的內容,這似乎很自然。 這讓我比我想象的更加困惑。 無論如何,下面的這種方法都會返回一個數據表,該數據表返回有關數據集的廣泛信息集,但是我找不到那里的訪問器來獲取有關有趣的數據表的信息(如下)。 可能我做錯了。

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)然后刪除所有行以使表為空的方法,但這肯定會影響性能。 什么是正確的解決方案?

您可以使用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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM