繁体   English   中英

ExecuteReader不返回任何内容

[英]ExecuteReader not returning anything

我有一个名为“ 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子句,而其他查询则不这样做...

但是我可以运行此存储的proc,它返回所有记录。

BEGIN
    SET NOCOUNT ON

    SELECT
        [Id],
        [MatchTypeName]
    FROM
        [dbo].[MatchType]
    RETURN @@ERROR
END

声明的不带大小的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属性

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM