Datareader не возвращает результатов в VS, но хранимая процедура возвращает несколько наборов результатов в Sql Server - PullRequest
5 голосов
/ 16 декабря 2008

У меня проблемы с получением результатов из моего хранилища данных в Visual Studio 2008. У меня есть несколько сохраненных Procs в одной базе данных. Я могу получить значения из тех, которые не получают входные параметры. Однако, когда я использую метод executreReader () для хранимого процесса с входными параметрами, я получаю пустой читатель данных. После изучения коллекции результатов появляется сообщение «IEnumerable не вернул результатов». Я сбит с толку, так как я могу выполнить хранимые процедуры на сервере SQL и вернуть наборы результатов. Ранее я был в состоянии извлечь строки из этих хранимых процедур в Visual Studio, но, видимо, однажды он просто перестал работать.

Я пытался использовать dataadapter, чтобы заполнить набор данных моими результатами, и использовать метод executereader (), чтобы получить sqldatareader, и все же я не получил результатов. Никаких исключений не выбрасывается. Все мои параметры имеют правильные имена, но я должен иметь возможность вызывать эти хранимые процедуры без параметров, и они возвращают нефильтрованный набор результатов. В настоящее время я использую следующий код:

string connStr = ConfigurationManager.ConnectionStrings["MyConnectionString"]
                                     .ConnectionString;

SqlConnection connCactus = new SqlConnection(connStr);
SqlCommand cmdPopulateFilterDropDowns = new SqlCommand( "dbo.MyStoredProc",
                                                        connCactus);
SqlDataReader rdrFilterSearch = null;
cmdPopulateFilterDropDowns.CommandType = CommandType.StoredProcedure;

connCactus.Open();
rdrFilterSearch = cmdPopulateFilterDropDowns
                      .ExecuteReader(CommandBehavior.CloseConnection);

return (rdrFilterSearch);

Пожалуйста, помогите!

Ответы [ 8 ]

5 голосов
/ 23 декабря 2008

глупая ошибка с моей стороны. После нескольких часов борьбы с этим я понял, что хранимые процедуры, которые я использовал, возвращают несколько наборов результатов, из которых первый набор результатов всегда был пустым. Отсюда и отсутствие результатов.

5 голосов
/ 16 декабря 2008

Вы когда-нибудь добавляли параметры в коллекцию параметров SqlCommand? Вы упомянули, что не работают те, которые принимают входные параметры, но в вашем коде у вас нет ничего подобного:

cmdPopulateFilterDropDowns.Parameters.AddWithValue(...);
2 голосов
/ 28 апреля 2010

У меня была похожая, но не идентичная проблема, которая сводила меня с ума, поэтому я добавлю это на случай, если это поможет кому-то по пути.

Я мог бы запустить SQL или вызвать хранимую процедуру с тем же SQL на SQL Server с помощью Management Studio и вернуть заполненный набор результатов. Но когда я использовал идентичный встроенный SQL или вызвал sproc, содержащий его, из своего кода Visual Studio для проекта веб-приложения ASP.Net, я получил пустой DataReader.

Как тот же идентичный SQL может возвращать набор результатов в Management Studio, но пустой DataReader в Visual Studio? Ответ состоял в том, что я работал от имени другого пользователя с разными разрешениями в двух инструментах. В Management Studio я работал в качестве разработчика в определенной роли SQL с большим количеством разрешений. Но в Visual Studio я работал как учетная запись службы, которой не были предоставлены разрешения для таблиц, к которым я обращался.

На самом деле, моя проблема была на один шаг сложнее. Все было хорошо, пока я не изменил SQL / sproc и не добавил таблицу JOIN в еще одну таблицу, а в этой таблице отсутствовали необходимые разрешения учетной записи службы. Но принцип тот же: проверьте все разрешения для пользователя, выполняющего вызов базы данных.

2 голосов
/ 16 декабря 2008

это может показаться очевидным, но, пожалуйста, скажите, что вы вызываете метод .Read ()? Ненавижу ставить такой вопрос, но иногда это самые очевидные вещи, которые мы забываем, когда сходим с ума от проблемы.

2 голосов
/ 16 декабря 2008

Запустите трассировку SQL-сервера для сервера, с которым, по вашему мнению, вы выполняете команду. Что на самом деле отправляется на сервер? Я думаю, что вы найдете там свой ключ к курению оружия.

BFree имеет хорошую точку, чтобы проверить AddWtihValue () против Add (). Также убедитесь, что если вы явно создаете экземпляры объектов SqlParameter, может возникнуть та же проблема, что и с .Add (). Обратите внимание, что в Parameters.Add () есть недостаток дизайна, когда вы передаете в него значения (int) 0 - они принимаются как перечисление вместо значения ...

1 голос
/ 07 декабря 2009

Установка параметра direction для sqlParam должна решить проблему.

mySqlParam.Direction = ParameterDirection.ReturnValue;

Если вы ожидаете, что будет возвращено более одного значения, просто добавьте параметр и установите его направление:

    SqlParameter mySqlParam = new SqlParameter();
    mySqlParam.ParameterName = "@ID";
    mySqlParam.SqlDbType = SqlDbType.int;
    mySqlParam.Direction = ParameterDirection.ReturnValue;

    SqlParameter mySqlParam = new SqlParameter();
    mySqlParam.ParameterName = "@Name";
    mySqlParam.SqlDbType = SqlDbType.NVarChar;
    mySqlParam.Direction = ParameterDirection.ReturnValue;


    SqlParameter mySqlParam = new SqlParameter();
    mySqlParam.ParameterName = "@Address";
    mySqlParam.SqlDbType = SqlDbType.NVarChar;
    mySqlParam.Direction = ParameterDirection.ReturnValue;

mySqlParam.ParameterName не обязательно должно совпадать с именем в хранимой процедуре.

Затем вы можете прочитать значения следующим образом (не полный пример):

int.Parse(dataReader["ID"]);
dataReader["name"].ToString();
dataReader["address"].ToString();

значение в dataReader[""].ToString(); должно соответствовать имени столбца из хранимой процедуры.

0 голосов
/ 03 ноября 2010

Использование

reader.ExecuteNonQuery() 

Счастливое кодирование

0 голосов
/ 16 декабря 2008

Когда вы получаете сообщение об ошибке «IEnumerable не дал результатов»? Не могли бы вы показать пример доступа к DataReader?

Что произойдет, если вы установите точку останова перед возвратом и запустите

rdrFilterSearch.GetString(0);

в ближайшем окне?

...