【问题标题】:Store each DataTable Column in string var将每个 DataTable 列存储在字符串 var 中
【发布时间】:2012-10-23 22:54:57
【问题描述】:

我想将每个数据表列存储在一个字符串变量中,以便我可以将所有这些参数传递给我的存储过程。 这将针对 DataTable 中的每一行进行

DataTable dtOutput;
dtOutput= Generix.getFeedData(1,ref Connection);
foreach (DataRow drOutput in dtOutput.Rows)
{
    Console.Write("IST: ");
    foreach (DataColumn dcOutput in dtOutput.Columns)
    {
        Console.Write(Convert.ToString(drOutput[dcOutput]) + "\t");
    }
    Console.WriteLine();
}

上面的代码应该打印每一列和一个 "\t" 作为分隔符和新行上的新行。我的数据表包含 4 列

我的 DataTable 以以下方式打印:

ATM         Message

ABC001      Hello
ABC002      SAGAR

现在我想通过以下方式:

string sAtm;// Should Print ABC001
string sMsg;//Should Print Hello

sAtm 中的下一行值将是 ABC002

【问题讨论】:

  • 如果这是您的代码“应该”打印的内容,那么当前打印的内容是什么?乍一看,这似乎是有效的代码...
  • 将每列打印的内容存储在字符串变量中。

标签: c#


【解决方案1】:

对于它的价值,您可以使用 Linq 将所有参数作为字符串获取。

挑选你需要的:

var allAsString = table.AsEnumerable()
    .Select((r, ri) => new
    {
        Row = r,
        RowNumber = ri,
        Fields = r.ItemArray.Select((f, i) => new 
        {
            Col = table.Columns[i],
            FieldText = string.Format("{0}", f)
        })
    });

因此,例如,如果您想迭代所有行并获取特定字段:

foreach (var rowInfo in allAsString)
{
    string sAtm = rowInfo.Fields.First(f => f.Col.ColumnName == "ATM").FieldText;
    string sMsg = rowInfo.Fields.First(f => f.Col.ColumnName == "Message").FieldText; 
}

记得加using system.Linq;


编辑:如果您想将整个 DataTable 保存在一个字符串中:

String strTable = String.Join(
        Environment.NewLine, 
        table.AsEnumerable().Select(r => String.Join("\t", r.ItemArray)));

【讨论】:

  • & 存储在哪个字符串数据列中?
  • 这将一次将每一列存储在一个字符串变量中..我希望一行中的所有列都存储在差异字符串变量中。
  • @SagarDumbre:如果您只想要一个包含所有行的所有字段的字符串,请编辑我的答案。如果您想要不同变量中所有行的所有字段,请使用我的第一种方法,它创建一个IEnumerable<anonymous type>
  • @SagarDumbre:再次编辑了我的答案。
【解决方案2】:

使用StringBuilder

StringBuilder sb = new StringBuilder();
DataTable dtOutput = Generix.getFeedData(1,ref Connection);

foreach (DataRow drOutput in dtOutput.Rows)
{
    sb.Append("IST: ");
    foreach (DataColumn dcOutput in dtOutput.Columns)
    {
        sb.Append(Convert.ToString(drOutput[dcOutput]) + "\t");
    }
    sb.AppendLine();
}

然后您的数据将存储在 sb 中,因此在传递给您的存储过程 sb.ToString() 时只需转换为字符串。

【讨论】:

  • 我不能将每一列的值存储到一个特定行的差异字符串中。下一行所有以前的字符串值都应该被删除
  • @SagarDumbre 好吧,是的,你可以。这是否意味着您将在dtOutput.Rows 的每次迭代中调用您的存储过程?
猜你喜欢
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
相关资源
最近更新 更多