我有一个存储过程,当我从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;找到"。
非常感谢任何帮助。
答案 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#代码中调用存储过程。