gpt4 book ai didi

c# - 从 C# 调用时,存储过程不返回记录,但在 SSMS 中工作

转载 作者:行者123 更新时间:2023-11-30 17:36:31 25 4
gpt4 key购买 nike

我有一个存储过程,当我从 SSMS 查询中调用它时,它可以正确返回记录。

存储过程如下:

CREATE PROCEDURE [dbo].[q_CheckRecords]
@ItemIDS AS VARCHAR(40)
AS
BEGIN
SET NOCOUNT ON

SELECT *
FROM q_Warehouse80_OOS_ItemsNeedingNotification
WHERE item_id = @ItemIDS
END

像这样从 SSMS 查询中调用它:

exec [q_CheckOOSWarehouse80ItemsNeedingNotification] 'B30-R10000-B001'

它正确地返回一行,但是当我使用此 C# 代码调用存储过程时,我从未返回任何行。

SqlCommand cmd = null;
SqlDataReader myReader = null;
System.Data.SqlClient.SqlConnection conn = null;

conn = new System.Data.SqlClient.SqlConnection("Data Source=" + sSessionServer + ";database=" + sSessionDatabase + "; Integrated Security=SSPI");

String SQL = "[q_CheckOOSWarehouse80ItemsNeedingNotification]";

cmd = new SqlCommand();
cmd.CommandText = SQL;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Connection = conn;
cmd.Parameters.Add("@ItemIDS", SqlDbType.VarChar).Value = ItemsToBeChecked;

conn.Open();
myReader = cmd.ExecuteReader();

// check to see if any rows were returned.
if (myReader.HasRows)
{
while (myReader.Read())
{
// code to read fields in returned rows here
}
}

conn.Close();

这似乎是 C# 如何定义传递给存储过程的数据类型的问题,但我尚未在网上找到有关如何解决此问题的任何信息。

如果我要更改存储过程,使其“硬编码”

@ItemIDS AS VARCHAR(40)
AS
BEGIN
SET NOCOUNT ON
select * from q_Warehouse80_OOS_ItemsNeedingNotification where item_id = 'B30-R10000-B001'
END

然后对它的 C# 调用正确地表明“找到”了一行。

如有任何帮助,我们将不胜感激。

最佳答案

当您没有指定varChar 的长度时sql treats it as length 1 .

cmd.Parameters.Add("@ItemIDS", SqlDbType.VarChar).Value = ItemsToBeChecked;

您的变量 ItemsToBeChecked 将被截断,我怀疑您的数据库中没有任何匹配值的第一个字符。

指定varchar的长度

cmd.Parameters.Add("@ItemIDS", SqlDbType.VarChar, 40).Value = ItemsToBeChecked;

您可以通过在 sql 上放置一个探查器并执行您的 c# 来验证情况是否如此。您将看到传递给 @ItemIDS 参数的值只有 1 个字符长。

关于c# - 从 C# 调用时,存储过程不返回记录,但在 SSMS 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39413128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com