Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с запросом  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
Вот застрял на ХР подскажите как лучше

Есть веб страничка там есть три поля для фильтрации
1 тип
1 пользователь
3 клиент

в зависимости от выбранных параметров должна вызывается ХР с параметрами или без них

Вот код

ALTER PROCEDURE [схема].[Test]
	@type bigint = 0,
    @userid bigint = 0,
    @client varchar(255) = null

as

////////////////////////////////////// отрабатывает если ни одного параметра не выбрано то есть при первой загрузке страницы
if (@type = 0 and @userid = 0 and @client = null)
begin
 SELECT dc.id as id
      ,lname 
	,fname 
      ,mname
      ,status
.....
      ,[date]
      ,dt.title as type
      ,uu.userlname+' '+uu.userfname as operator
  FROM [схема].[D...Clients] dc  inner join [схема].[D...Types] dt on dt.id=dc.idType
                                  inner join [схема].[Users] uu on uu.userid=dc.OperatortId
  where dc.status in (0,2) order by dc.[date], dc.status
end

//////////////////////////// отрабатывает когда выбран тип продукта например
else if (@type > 0 and @userid = 0 and @client = null)

begin
SELECT dc.id as id
      ,lname 
	,fname 
      ,mname
      ,status
.....
      ,[date]
      ,dt.title as type
      ,uu.userlname+' '+uu.userfname as operator
  FROM [схема].[D...Clients] dc  inner join [схема].[D...Types] dt on dt.id=dc.idType
                                  inner join [схема].[Users] uu on uu.userid=dc.OperatortId
  where dc.status in (0,2) and dt.id=@type order by dc.[date], dc.status
end

///////////////////////////отрабатывает когда выбран оператор который ответственный за заявку 
else if (@type = 0 and @userid > 0 and @client = null)

begin
SELECT dc.id as id
      ,lname 
	,fname 
      ,mname
      ,status
.....
      ,[date]
      ,dt.title as type
      ,uu.userlname+' '+uu.userfname as operator
  FROM [схема].[D...Clients] dc  inner join [схема].[D...Types] dt on dt.id=dc.idType
                                  inner join [схема].[Users] uu on uu.userid=dc.OperatortId
  where dc.status in (0,2) and uu.userid=@userid order by dc.[date], dc.status
end


////////////////// и т д всего 8 вариантов

Так вот проблема в том что на ASP.NET странице вылетает ошибка
Вот сама ошибка Недопустимая попытка чтения при отсутствии данных.

Хотя я брал вот этот кусок кода:

SELECT dc.id as id
      ,lname 
	,fname 
      ,mname
      ,status
.....
      ,[date]
      ,dt.title as type
      ,uu.userlname+' '+uu.userfname as operator
  FROM [схема].[D...Clients] dc  inner join [схема].[D...Types] dt on dt.id=dc.idType
                                  inner join [схема].[Users] uu on uu.userid=dc.OperatortId
  where dc.status in (0,2) order by dc.[date], dc.status


тестировал в sql management studio, создал 2 тестовые строки для проверки и работает.

Может в блоках if ... else if ошибка но никак не могу понять где?

Спасибо.
23 янв 13, 11:16    [13813956]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
VIT2708
Недопустимая попытка чтения при отсутствии данных.
Это не серверная ошибка.
23 янв 13, 11:17    [13813964]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4539
@client = null
@client is null
либо отключить ансы нулл... и полюбому - обрабатывать на клиенте такие ситуевины нужно :)
23 янв 13, 11:20    [13813984]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104751
VIT2708
Может в блоках if ... else if ошибка но никак не могу понять где?

@client = null - с null сравнивают вот так @client is null

Скорее всего ваша процедура ничего не вернула. Поэтому и "попытка чтения при отсутствии данных."
23 янв 13, 11:22    [13813993]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
VIT2708
Так вот проблема в том что на ASP.NET странице вылетает ошибка
Вот сама ошибка Недопустимая попытка чтения при отсутствии данных.

Хотя я брал вот этот кусок кода
Так у вас что вызывается, "вот этот кусок кода" или процедура?

У вас else нету в процедуре, наверняка просто нет результата.

А вообще отлаживают не так. Вы посмотрите полную ошибку, найдите стсроку в коде на ASP.NET, в которой она происходит (может, она вообще с сиквелом не связана, может, там какого нибуть файла нету для веб-стринички?).

Если сиквельная, то выведите полностью весь вызов с параметрами, на котором происходит ошибка, потом этот вызов сделайте из SSMS. Вот как то так для начала.
23 янв 13, 11:22    [13813997]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
buser,

а как тогда быть при первой загрузке страницы, ведь когда она впервые грузится то параметры не передаются? ну а дальше работать от условия
23 янв 13, 11:24    [13814011]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
alexeyvg
VIT2708
Так вот проблема в том что на ASP.NET странице вылетает ошибка
Вот сама ошибка Недопустимая попытка чтения при отсутствии данных.

Хотя я брал вот этот кусок кода
Так у вас что вызывается, "вот этот кусок кода" или процедура?

У вас else нету в процедуре, наверняка просто нет результата.

А вообще отлаживают не так. Вы посмотрите полную ошибку, найдите стсроку в коде на ASP.NET, в которой она происходит (может, она вообще с сиквелом не связана, может, там какого нибуть файла нету для веб-стринички?).

Если сиквельная, то выведите полностью весь вызов с параметрами, на котором происходит ошибка, потом этот вызов сделайте из SSMS. Вот как то так для начала.


так в студии при при отладке эта строка и выдается. Должны загрузится 2 строки но они не грузятся. Сам select работает вот с множеством if кажется в них проблема
23 янв 13, 11:29    [13814048]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4539
VIT2708,

Я не знаю... как вы вызываете... @client varchar(255) = null
23 янв 13, 11:32    [13814070]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
Glory
VIT2708
Может в блоках if ... else if ошибка но никак не могу понять где?

@client = null - с null сравнивают вот так @client is null

Скорее всего ваша процедура ничего не вернула. Поэтому и "попытка чтения при отсутствии данных."


вы правы я через эти else if в конце забыл добавить else

Спасибо.
23 янв 13, 11:35    [13814095]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
buser
VIT2708,

Я не знаю... как вы вызываете... @client varchar(255) = null


SetProcedure("схема.Test");
if (type > 0) { AddParameter(new DbParameter("@type", type, SqlDbType.BigInt)); }
if (userid > 0) { AddParameter(new DbParameter("@userid", type, SqlDbType.BigInt)); }
if (!string.IsNullOrEmpty(client)) { AddParameter(new DbParameter("@client", client)); }

try
{
reader = command.ExecuteReader();
while (reader.Read())
{
заполнение обьекта
}
}

то есть если строковая переменная client не равна null или она не пуста то параметр добавляется.

но суть проблемы я нашел, я про else забыл
23 янв 13, 11:39    [13814122]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
VIT2708
Glory
пропущено...

@client = null - с null сравнивают вот так @client is null

Скорее всего ваша процедура ничего не вернула. Поэтому и "попытка чтения при отсутствии данных."


вы правы я через эти else if в конце забыл добавить else

Спасибо.
Вы хоть читайте ответы :-)

Если вы добавите else, то у вас всегда гарантированно будет вызываться только эта ветка, потому что условия во всех остальных ветках всегда равны FALSE
23 янв 13, 11:40    [13814132]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
alexeyvg
VIT2708
пропущено...


вы правы я через эти else if в конце забыл добавить else

Спасибо.
Вы хоть читайте ответы :-)

Если вы добавите else, то у вас всегда гарантированно будет вызываться только эта ветка, потому что условия во всех остальных ветках всегда равны FALSE


так мне нужно было хоть какие то данные получить при первой загрузке страницы что бы убедится что на стороне клиента все в порядке. Для условий поиска я еще функционал не написал.
23 янв 13, 13:16    [13814925]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить