存储过程正确运行,但 DataReader 得到错误结果...有时

Posted

技术标签:

【中文标题】存储过程正确运行,但 DataReader 得到错误结果...有时【英文标题】:Stored procedure runs correctly but DataReader gets wrong result...sometimes 【发布时间】:2019-08-14 14:08:30 【问题描述】:

我有一个用于旅行预订系统的存储过程,它接收 TripID 并识别旅行是否为国内旅行(例如,所有旅行航段的出发地和目的地国家是否相同)。当我从 SSMS 运行该过程时,它正确地返回 1 代表国内和 0 代表国际。但是,当我尝试通过 DataReader 访问我的应用程序中的数据时,它不恰当地为国内旅行返回 0。

话虽如此,我认为问题不仅仅在于 DataReader,因为当我将存储过程更改为立即返回 1 时,DataReader 将正确检测到该值。

任何人都可以建议更改我的代码以解决此问题吗?

这里是存储过程,精简:

SET NOCOUNT ON;

    --  EXEC CheckIsDomestic 6343

    Declare @HomeOffice INT = (SELECT TOP 1 o.DestinationID
                                    FROM  TR_Trips t
                                    JOIN TR_Travelers ta ON t.TravelerID = ta.TravelerID
                                    JOIN TR_OfficeLocations o ON ta.OfficeID = o.Office_Loc_Id
                                    WHERE t.TripID = @TripID)

    SELECT l.Destination_ID AS DestinationID
    INTO #TempDest
    FROM TR_Trips t JOIN TR_Legs l ON t.TripID = l.TripID
    WHERE t.TripID = @TripID                                                    

    --Check whether there is a destination in the list that is different than the home country                                                      
    DECLARE @CountRows int = (SELECT COUNT(*) 
    FROM #TempDest t
    WHERE DestinationID <> @HomeOffice )                                                        

    IF @CountRows > 0
    BEGIN 
    SELECT 0
    RETURN --tried with and without RETURN; no change
    END
    ELSE 
    BEGIN SELECT 1
    RETURN
    END

以下是我的应用程序的适用部分:

 public bool IsDomestic(int TripID)
        
            bool ReturnValue = true;
            NewStoredProcedureCommand("CheckIsDomestic");
            AddParameter("@TripID", TripID, System.Data.SqlDbType.Bit);
             ReturnValue = Execute_ReturnValueBool();
            return ReturnValue;
        

 public Boolean Execute_ReturnValueBool()
        
            if (sqlCommand == null)
                NewCommand();
                if (sqlCommand.Connection.State != ConnectionState.Open)
                    sqlCommand.Connection.Open();
                bool ReturnValue = false;
                SqlDataReader DR = sqlCommand.ExecuteReader();
                if (DR.HasRows)
                
                    DR.Read();
                    System.Diagnostics.Debug.WriteLine(DR[0]);
                    ReturnValue = Convert.ToBoolean(DR[0]);
                
                DR.Close();
                sqlCommand.Connection.Close();
                return ReturnValue;
        

【问题讨论】:

我建议您在存储过程中添加一个 OUTPUT 参数。然后设置该参数代替 SELECT 1(或 0)。在您的代码中,使用 Command.ExecuteNonQuery 函数,然后读取输出参数的值。 除非您可以生成足够的代码和数据来重现该问题,否则其他任何人都无法回答此问题。但是,上面 HardCode 的建议是一个很好的建议。根据您发布的内容,最大的可能性是 DataReader 没有将您认为的参数传递给存储过程。 为什么在应用程序代码中为您的 TripID 参数使用 BIT 类型?尝试将其设置为 INT。 @JM_ 谢谢!那是一个错误,纠正它解决了这个问题。如果您想将其作为解决方案发布,我会将其标记为已接受。 【参考方案1】:

为什么在应用程序代码中为 TripID 参数使用 BIT 类型?尝试将其设置为 INT。

【讨论】:

以上是关于存储过程正确运行,但 DataReader 得到错误结果...有时的主要内容,如果未能解决你的问题,请参考以下文章

存储过程无法得到返回型参数

如何使用 c# datareader 和存储过程从 spl server 2012 数据表更新单个记录?

如何在C#中使用存储过程和datareader返回记录列表

如何更改 Snowflake 存储过程中的会话参数

寻找重置或清除 DataReader 的方法

检查 DataReader 中是不是存在列的最佳方法