ExecuteReader ничего не возвращает

У меня есть таблица под названием "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 Метод, который я передаю в строке "Один день". Я подтвердил это путем отладки. Я не могу опубликовать сообщение об ошибке, которое может быть полезным, так как оно не генерируется. Просто данные не возвращаются в ридер...

У меня есть несколько других методов и хранимых процедур, которые используют аналогичный процесс, и они работают. Единственное, что я вижу, это то, что я использую WHERE предложение о значении varchar/string, которое другие запросы не делают...

Все же я могу запустить этот сохраненный процесс, и он возвращает все записи..

BEGIN
    SET NOCOUNT ON

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

3 ответа

Длина по умолчанию для varchar объявлено без размера 1. Вы объявили это так в своем сохраненном параметре proc, поэтому передаете только первый символ.

Измените свою декларацию:

(@matchTypeName varchar)

до соответствующего размера:

(@matchTypeName varchar(20))

Кроме того, добавьте размер в коде и убедитесь, что регистр в имени вашего параметра соответствует вашему сохраненному процессу:

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

Попробуй это:

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

Процедура запускает запрос и показывает результаты (именно поэтому он работает в 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
Другие вопросы по тегам