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

本文关键字:记录 但在 返回 SSMS 工作 调用 存储过程 | 更新日期: 2023-09-27 18:06:18

我有一个存储过程,当我从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#对它的调用正确地指示了一行被"找到"。

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

当您不指定varChar的长度时,sql将其视为长度为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#代码中调用存储过程。

相关文章: