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