2013-07-30 53 views
-1

我需要將我從DataTable從列表中拉出的幾行數據轉換爲以逗號分隔的字符串。這是我現在擁有的。它根本不起作用(它在消息框中顯示System.Data.DataRow,System.Data.DataRow),但列表中的斷點顯示正確的行數,並帶有正確的數據。將列表<DataRow>轉換爲字符串

cmd3.Fill(badnum); 

List<DataRow> list = badnum.AsEnumerable().ToList(); 
string badnumbers = string.Join(",", list); 
MessageBox.Show(badnumbers); 
+5

請定義「它不工作」。 –

+0

或者,定義輸入'List '和預期的結果字符串。單個DataRow應該如何表示爲一個字符串? – stakx

回答

3

你的問題在於你是如何使用DataRow
DataRow s包含多個值。

典型用途是引用行內的特定列。

E.g. dataRow["MyColumnName"]或指數dataRow[0]

0

您不需要轉換爲列表。您可以每一行轉換爲csv如下

foreach (DataRow dr in badnum.Rows) 
     string csv = String.Join(",", row.ItemArray); 
1

string.Join()需要string[]IEnumerable<string>

試試這個:

List<DataRow> list = badnum.AsEnumerable().ToList(); 
string badnumbers = string.Join(",", list.Select(r=>r["MyColumn"].ToString()).ToArray()); 
MessageBox.Show(badnumbers); 
+1

真的嗎? http://msdn.microsoft.com/en-us/library/dd992421.aspx – Dennis

+0

如果您使用.Net 4.0 +,您可以使用IEnumerable ,但較低版本需要string [] –

+0

是否有關於.NET版本的內容這個問題? – Dennis

0

像這樣的東西應該做的你:

static void Main(string[] args) 
{ 
    const string connectString = "Server=localhost;Database=sandbox;Trusted_Connection=True;"; 

    DataTable dt = new DataTable() ; 
    using (SqlConnection conn = new SqlConnection(connectString)) 
    using (SqlCommand cmd = conn.CreateCommand()) 
    using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) 
    { 
    cmd.CommandText = @"select * from sys.objects" ; 
    cmd.CommandType = CommandType.Text; 
    conn.Open(); 
    int rows = sda.Fill(dt) ; 
    } 

    Func<string,string> qt = x => "\"" + x.Replace("\"","\"\"") + "\"" ; 

    DataRow dr = dt.Rows[0] ; 
    string csv = dt.Columns 
       .Cast<DataColumn>() 
       .Select(c => qt(c.ColumnName) + "=" + qt(dr[c].ToString())) 
       .Aggregate((acc,s) => acc + "," + s) 
       ; 
    Console.WriteLine(csv) ; 

    return ; 
} 

定義自己的語義該行應該是什麼樣子。