我有一个在SQL Server中可以正常运行的存储过程。

我在C#中这样称呼它(第一行是r):

DateTime beginDate = new DateTime(2016, 5, 1);
DateTime? endDate = new DateTime(2016, 5, 31);

this.getDailySalesTableAdapter.Fill(myDataSet.getDailySales, beginDate, endDate);
MessageBox.Show(rMSDataSet.getDailySales.Count.ToString()) ;  //SHOWS 8549 ROWS

MYDataSet.getDailySalesRow r = myDataSet.getDailySales.First();
string mb = "";

// error here---->>>
foreach (DataColumn dc in r.ItemArray)
{
    if (r[dc] != null) // This will check the null values also
    {
        mb = mb + r[dc] + " ";
    }

    MessageBox.Show(mb);
}


它编译正常,但是我在DC上遇到的运行时错误是


  无法将类型为“ System.String”的对象转换为类型为“ System.Data.DataColumn”的对象


在SQL Server中,我的存储过程开始:

ALTER PROCEDURE [dbo].[getDailySales]
    @begindate date,
    @enddate date

最佳答案

我可以想象您的问题是r.ItemArray包含字符串而不是DataColumn对象。之所以得出这个结论,是因为foreach (DataColumn dc in r.ItemArray)是我可以看到的唯一尝试将对象强制转换为DataColumn的位置。

看起来r.ItemArray可能是object[](从https://msdn.microsoft.com/en-us/library/system.data.datarow.itemarray(v=vs.110).aspx来看)。因此,如果您只想从中获取所有值,则可以遍历它并查看每个值。

我认为,以下代码应该可以大致满足您的要求。 Stringbuilder的想法来自评论,归功于KonB。当遇到空字段时,它也会打印出(null)(尝试找出哪些列中的值时,跳过它们可能会造成混淆。

var mb= new StringBuilder();
foreach (object dataItem in r.ItemArray)
{
    if (dataItem != null) // This will check the null values also
    {
        mb.Append(dataItem.ToString());
    }
    else
    {
        mb.Append("(null)");
    }
    mb.Append(" ");
}
MessageBox.Show(mb.ToString());

10-08 05:20