1

问题描述:

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

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

数据库的期望值

以下是 .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 数据类型和值以供参考。

数据类型说明

解释:

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

以下是我在 SQLServer 查询编辑器中传递 int 值时看到的内容。

迪斯克

数据类型更改为 DateTime

日期时间数据类型

谢谢您的支持。

4

2 回答 2

0

我在这里看到的一个失败原因是参数顺序不是您认为的那样;在 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您正在调用存储过程,那将会更加简洁;那么你根本不需要这个,因为如果命令类型是存储过程,则“按名称”是 SqlClient 的默认值。

顺便说一句:你可能会发现像 Dapper 这样的工具更容易做到这一点:

tempspexec = conn.Query<StoredProcDataExecution>("GetWorkOrderChartDataAsync",
    new { // parameters
        targetType=28, targeID=targetID, startDateToUse="2019",
        problemID=problemId1, tradeID=tradeId1
    }, commandType: CommandType.StoredProcedure).AsList();
于 2020-02-27T16:16:05.767 回答
0

我找到了解决方案。

我开始使用 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

                    }
                }

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

于 2020-02-27T21:27:27.497 回答