使用 SQLQuery returns 不正确的值在 .NET 应用程序中执行存储过程

Execution of Stored Procedure in .NET application using SQLQuery returns incorrect values

问题描述:

我正在尝试调用 .NET Core 应用程序中的存储过程。 出于测试目的,我发送的硬编码值与我在 SQL 服务器查询编辑器中传递的值和数据类型相同。

以下是我传入 SQL 服务器查询编辑器的值、存储过程名称及其数据类型的屏幕截图:

.NET端代码如下:

int targetID = 2069;
int problemId1 = 0;
int tradeId1 = 0;

SqlParameter param1 = new SqlParameter("@targetType", 28);
SqlParameter param2 = new SqlParameter("@targeID", targetID);
SqlParameter param3 = new SqlParameter("@startDateToUse", "2019");
SqlParameter param4 = new SqlParameter("@problemID", problemId1);
SqlParameter param5 = new SqlParameter("@tradeID", tradeId1);

tempspexec = DbContext.Database
    .SqlQuery<StoredProcDataExecution>("exec GetWorkOrderChartDataAsync @targetType, @targeID, @startDateToUse, @problemID, @tradeID ", param1, param2, param3, param4, param5
    ).ToList();

注意: 以下截图显示了 param3 数据类型和值以供参考。

解释:

存储过程需要 "startDateToUse" 的字符串值,如果我们将 int 传递给它,它会崩溃并且 returns 在数据集中全为零。我在我的 .NET 应用程序中传递字符串,但它仍然 returns 在我的数据集中全为零。

以下是我在 SQL 服务器查询编辑器中传递 int 值时看到的结果。

数据类型更改为 DateTime

感谢您的支持。

我在这里看到的一个失败原因是参数顺序不是您认为的那样;在 SSMS 中,您通过 name 传递参数,但在 C# 中,您通过 position 传递参数;也许尝试在 exec 用法中命名它们?

tempspexec = DbContext.Database
    .SqlQuery<StoredProcDataExecution>("exec GetWorkOrderChartDataAsync @targetType=@targetType, @targeID=@targeID, @startDateToUse=@startDateToUse, @problemID=@problemID, @tradeID=@tradeID", param1, param2, param3, param4, param5
    ).ToList();

请注意,如果您能告诉 SqlQuery 您正在调用一个存储过程,那将更加清晰;那么你根本不需要它,因为如果命令类型是存储过程,"by name" 是 SqlClient 的默认值。

顺便说一句:您 可能 更容易找到像 Dapper 这样的工具:

tempspexec = conn.Query<StoredProcDataExecution>("GetWorkOrderChartDataAsync",
    new { // parameters
        targetType=28, targeID=targetID, startDateToUse="2019",
        problemID=problemId1, tradeID=tradeId1
    }, commandType: CommandType.StoredProcedure).AsList();

我找到了解决方法。

我开始使用 SQLCommand 而不是 SQLQuery。暂时工作。

                DataTable dt = new DataTable();
                SqlConnection conn = new SqlConnection(ConfigurationManager.
                                 ConnectionStrings["SampleTXT"].ConnectionString);
                    conn.Open();

                SqlCommand cmd = new SqlCommand("sp_GetWorkOrderChartDataAsync", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                using (SqlDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                       // Some Code here

                    }
                }

感谢大家的宝贵时间和支持。所有评论都非常有帮助。