-1

我需要将从列表中的数据表中提取的几行数据转换为用逗号分隔的字符串。这就是我现在所拥有的。它根本不起作用(它显示System.Data.DataRow,System.Data.DataRow在消息框中),但是列表中的断点显示正确的行数和正确的数据。

cmd3.Fill(badnum);

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

4 回答 4

3

您的问题在于您如何使用DataRow.
DataRows 包含多个值。

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

例如dataRow["MyColumnName"]或按索引dataRow[0]

于 2013-07-30T18:48:05.237 回答
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);
于 2013-07-30T18:49:00.787 回答
0

您无需转换为列表。您可以按如下方式将每一行转换为 csv

    foreach (DataRow dr in badnum.Rows)
        string csv = String.Join(",", row.ItemArray);
于 2013-07-30T18:47:50.170 回答
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 ;
}

为行的外观定义您自己的语义。

于 2013-07-30T19:15:29.403 回答