我需要将从列表中的DataTable中提取的几行数据转换为用逗号分隔的字符串。这是我现在拥有的。它根本不起作用(它在消息框中显示System.Data.DataRow,System.Data.DataRow
),但是列表中的断点显示了正确的行数和正确的数据。
cmd3.Fill(badnum);
List<DataRow> list = badnum.AsEnumerable().ToList();
string badnumbers = string.Join(",", list);
MessageBox.Show(badnumbers);
您的问题在于如何使用DataRow
DataRow
包含多个值。
典型的用法是引用行中的特定列。
例如dataRow["MyColumnName"]
或按索引dataRow[0]
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);
您不需要转换为列表。您可以将每一行转换为csv,如下所示
foreach (DataRow dr in badnum.Rows)
string csv = String.Join(",", row.ItemArray);
像这样的事情应该对你有用:
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 ;
}
为行的外观定义自己的语义。