Datareader не возвращает результатов в VS, но хранимая процедура возвращает несколько наборов результатов на сервере Sql

У меня возникают проблемы с получением результатов из моего устройства чтения данных в Visual Studio 2008. У меня есть несколько сохраненных процессов в одной базе данных. Я могу получить значения от тех, кто не получает входных параметров. Однако, когда я использую метод executeReader () в сохраненной процедуре с входными параметрами, я получаю пустой загрузчик данных. После проверки коллекции результатов появляется сообщение «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);

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

Если вы поставите точку останова на строку executereader и перейдете через нее, будет ли программа чтения все еще пуста?

JamesSugrue 16.12.2008 03:22

Кроме того, может помочь, если вы тоже разместите SP?

JamesSugrue 16.12.2008 03:23

Если я поставлю точку останова и наведу курсор на средство чтения данных, при расширении просмотра результатов появится сообщение «Перечисление не дало результатов»

16.12.2008 03:29

Просто чтобы охватить все основы, у вас нет каких-либо забавных разрешений, установленных для БД, не так ли (хотя это все равно должно вызывать ошибку)? Также - вы подключаетесь к правильной БД в строке подключения в Web.Config? Платит за то, чтобы сначала проверить очевидные вещи.

Phil.Wheeler 16.12.2008 03:31

Да, с разрешениями все в порядке. Я использую одну и ту же строку подключения для всего веб-приложения. Некоторые SP возвращают результаты, другие нет. Я могу получить результаты от всех сохраненных процессов, которые не принимают входные параметры, и я не могу получить результаты от тех, которые принимают.

16.12.2008 03:56

вы тогда устанавливаете параметры?

JamesSugrue 16.12.2008 04:29

Я установил параметры для значений, которые, как я знаю, существуют в БД и не получают значений. Я также попытался не отправлять какие-либо параметры, так как я не могу отправлять фильтры (параметры) и получать неотфильтрованный набор результатов.

16.12.2008 19:55

У тебя есть решение? У меня такая же проблема. Кто-нибудь ?

Chintan 07.08.2017 17:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
8
17 998
8

Ответы 8

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

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

rdrFilterSearch.GetString(0);

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

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

cmdPopulateFilterDropDowns.Parameters.AddWithValue(...);

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

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

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

Приведенный выше код возвращает читателя, я использую метод .read () в вызывающем коде.

16.12.2008 21:00

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

Иногда глупые ответы оказываются лучшими. У меня была аналогичная проблема.

Xynariz 11.02.2014 01:38

Установка параметра в 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(); должно соответствовать имени столбца из хранимой процедуры.

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

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

Использовать

reader.ExecuteNonQuery() 

Удачного кодирования

Другие вопросы по теме