[英]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.