存储过程在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#对它的调用正确地指示了一行被"找到"。
当您不指定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#代码中调用存储过程。