簡體   English   中英

如何將 C# Datatable 對象的行轉換為一系列 select 語句?

[英]How can I convert the rows of a C# Datatable object into a series of select statements?

我正在調試一個單獨的問題,發現為了解決該問題,創建一個擴展方法會很有幫助,該方法采用 ac# 數據表對象並將其每一行的內容轉換為一系列 SELECT語句,從每個單元格中獲取數據和每列的列名,然后在每個單元格之間放置一個 UNION ALL 作為重建表格及其所有內容的一種方式。

實際上,我們會生成類似以下內容的內容,您可以將其轉儲到 ssms 中以輕松查看內容:

SELECT "1-1-2020" as [CreateDate], 18 as [NumOfGuests] 
UNION ALL
SELECT "1-2-2020" as [CreateDate], 48 as [NumOfGuests] 

我已經在這個問題上敲了一陣子,到目前為止還沒有想出一個好的解決方案,任何和所有的輸入或方向都將不勝感激。

更新 :

回答奧利維爾關於問題的具體問題; 我一直在考慮如下遍歷表格的內容(還沒有機會對此進行測試),但感覺必須有比我想出的更好的解決方案。

public static string ParseDataColumns(this DataTable dataTable)
{
    var sb = "";

    if (dataTable.Columns.Count <= 0) return sb;
    sb += "SELECT ";
    foreach (DataRow row in dataTable.Rows)
    {
        foreach (DataColumn column in dataTable.Columns)
        {
            if (column.Ordinal != 0)
            {
                sb += ", " + row[column].ToString() + " AS [" + column.ColumnName + "]";    
            }
            else
            {
                sb += row[column].ToString() + " AS [" + column.ColumnName + "]";
            }
        }
    sb += "UNION ALL" + dataTable.TableName;
    }
    return sb.ToString();
}

您可以將 LINQ 與輔助方法一起使用來執行此操作。 幫助程序將 C# 數據類型轉換為 SQL 文字,您可能需要添加其他情況:

public static class DataRowExt {
    public static string SQLLiteral(this DataRow r, DataColumn c) {
        if (c.DataType == typeof(String))
            return $"\"{r.Field<string>(c.ColumnName)}\"";
        else if (c.DataType == typeof(DateTime))
            return $"\"{r.Field<DateTime>(c.ColumnName).ToString("yyyy-MM-dd HH:mm:ss.fff")}\"";
        else
            return r[c.ColumnName].ToString();
    }

    public static string SQLLiteral(this DataTable dt) =>
        String.Join("\nUNION ALL\n", dt.AsEnumerable().Select(r => "SELECT " + String.Join(", ", dt.Columns.Cast<DataColumn>().Select(c => $"{r.SQLLiteral(c)} AS [{c.ColumnName}]"))));
}

現在你的答案很簡單:

public static string ParseDataColumns(this DataTable dataTable) => dataTable.SQLLiteral();

使用linq從c#表中獲取所有數據,然后將其序列化到json文件中。 將 json 字符串解析為字符串-字符串元組列表。 最后,將每個元組轉換為字符串,添加“select”和其他 sql 關鍵字。 這適用於簡單的數據格式。

或者,您可以僅以 CSV 格式導出表格並將其導入到 ssms。

暫無
暫無

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

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