从C#调用时,存储过程不会返回记录,但在SSMS中有效

时间:2016-09-09 13:50:20

标签: c# sql-server stored-procedures

我有一个存储过程,当我从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#调用它正确表明一行是#34;找到"。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

如果您未指定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个字符长。

答案 1 :(得分:0)

您遇到的问题是因为您没有在C#代码中调用存储过程。