我有一个在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());