使用 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
}
}
感谢大家的宝贵时间和支持。所有评论都非常有帮助。
问题描述:
我正在尝试调用 .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
}
}
感谢大家的宝贵时间和支持。所有评论都非常有帮助。