我有一个在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
答案 0 :(得分:3)
您需要使用DataColumn.ColumnName
属性:
foreach (DataColumn dc in r.ItemArray)
{
if (r[dc] != null) // This will check the null values also
{
mb = mb + r[dc.ColumnName] + " "; //Updated
}
MessageBox.Show(mb);
}
答案 1 :(得分:1)
我想你的问题是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());