ExecuteReader没有返回任何内容

时间:2015-12-30 22:14:50

标签: c# sql sql-server stored-procedures varchar

我有一个名为'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

3 个答案:

答案 0 :(得分:7)

声明没有大小的varchar的默认长度是1.你在存储的proc参数中声明它就像那样,所以你只传递第一个字符。

更改您的声明:

(@matchTypeName varchar)

到相关尺寸:

(@matchTypeName varchar(20))

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

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

答案 1 :(得分:0)

该过程正在运行查询并显示结果(这就是它在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

答案 2 :(得分:0)

试试这个:

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 Property