如何在SQL Server中测试存储过程错误

问题描述 投票:1回答:2

我有一个在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 
c# sql-server stored-procedures
2个回答
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());

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.