ExecuteReader未返回任何内容

本文关键字:任何内 返回 ExecuteReader | 更新日期: 2023-09-27 18:28:30

我有一个名为"MatchType"的表,它包含:

ID | MatchTypeName
1  | One Day
2  | Two Day
3  | T20

我有一种方法可以根据与MatchTypeName:中的值匹配的字符串从该表中检索记录

public static int GetByName(string matchType)
{          
    MatchType item = new MatchType();
    using (SqlConnection con = new SqlConnection(BaseDataAccessLayer.GetConnectionStringByName()))
    {
        using (SqlCommand cmd = new SqlCommand(STORED_PROC_GetByName, con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@matchTypeName", SqlDbType.VarChar, 20).Value = matchType;
            con.Open();
            using (IDataReader reader = cmd.ExecuteReader())
            {
                item.LoadFromReader(reader);
            }
        }
    }
    return item.Id;
}

此方法调用以下存储过程:

CREATE PROCEDURE [dbo].[MatchType_GetByName]
    (@matchTypeName varchar(20))
AS
BEGIN
    SET NOCOUNT ON
    SELECT 
        [Id], [MatchTypeName]
    FROM 
        [dbo].[MatchType]
    WHERE 
        [MatchTypeName] = @matchTypeName
    RETURN @@ERROR
END

当调用GetByName方法时,我传递一个字符串"One Day"。我已经通过调试确认了这一点。我不能发布有帮助的错误消息,因为没有生成错误消息。只是读取器中没有返回任何数据。。。

我还有其他几个方法和存储过程,它们使用类似的过程,并且它们都能工作。我唯一能看到的区别是,我在varchar/string值上使用了WHERE子句,这是其他查询无法做到的…

然而,我可以运行这个存储过程,它会返回所有记录。。

BEGIN
    SET NOCOUNT ON
    SELECT
        [Id],
        [MatchTypeName]
    FROM
        [dbo].[MatchType]
    RETURN @@ERROR
END

ExecuteReader未返回任何内容

声明的不带大小的varchar的默认长度为1。您在存储的proc参数中这样声明它,所以只传递第一个字符。

更改申报:

(@matchTypeName varchar)

相关大小:

(@matchTypeName varchar(20))

此外,在代码中添加大小,并确保参数名称中的大小写与存储的proc:匹配

cmd.Parameters.Add("@matchTypeName", SqlDbType.VarChar, 20).Value = matchType;

该过程运行查询并显示结果(这就是它在SSMS中工作的原因),但实际上没有返回任何内容。试试这个(注意,我还没有真正测试过)。

CREATE PROCEDURE [dbo].[MatchType_GetByName]
    @matchTypeName varchar(20),
    @matchTypeID INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON
    SELECT 
        @matchTypeID = [Id], [MatchTypeName]
    FROM 
        [dbo].[MatchType]
    WHERE 
        [MatchTypeName] = @matchTypeName
    RETURN @@ERROR
END

试试这个:

using (SqlCommand cmd = new SqlCommand(STORED_PROC_GetByName, con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@matchTypeName", matchType);
            con.Open();
            using (IDataReader reader = cmd.ExecuteReader())
            {
                item.LoadFromReader(reader);
            }
        }

SqlCommand.Parameters属性