Помогите с запросом

VIT2708
Дата: 23.01.2013 11:16:52
Вот застрял на ХР подскажите как лучше

Есть веб страничка там есть три поля для фильтрации
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.01.2013 11:17:59
VIT2708
Недопустимая попытка чтения при отсутствии данных.
Это не серверная ошибка.
buser
Дата: 23.01.2013 11:20:51
@client = null
@client is null
либо отключить ансы нулл... и полюбому - обрабатывать на клиенте такие ситуевины нужно :)
Glory
Дата: 23.01.2013 11:22:24
VIT2708
Может в блоках if ... else if ошибка но никак не могу понять где?

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

Скорее всего ваша процедура ничего не вернула. Поэтому и "попытка чтения при отсутствии данных."
alexeyvg
Дата: 23.01.2013 11:22:49
VIT2708
Так вот проблема в том что на ASP.NET странице вылетает ошибка
Вот сама ошибка Недопустимая попытка чтения при отсутствии данных.

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

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

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

Если сиквельная, то выведите полностью весь вызов с параметрами, на котором происходит ошибка, потом этот вызов сделайте из SSMS. Вот как то так для начала.
VIT2708
Дата: 23.01.2013 11:24:21
buser,

а как тогда быть при первой загрузке страницы, ведь когда она впервые грузится то параметры не передаются? ну а дальше работать от условия
VIT2708
Дата: 23.01.2013 11:29:41
alexeyvg
VIT2708
Так вот проблема в том что на ASP.NET странице вылетает ошибка
Вот сама ошибка Недопустимая попытка чтения при отсутствии данных.

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

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

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

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


так в студии при при отладке эта строка и выдается. Должны загрузится 2 строки но они не грузятся. Сам select работает вот с множеством if кажется в них проблема
buser
Дата: 23.01.2013 11:32:01
VIT2708,

Я не знаю... как вы вызываете... @client varchar(255) = null
VIT2708
Дата: 23.01.2013 11:35:49
Glory
VIT2708
Может в блоках if ... else if ошибка но никак не могу понять где?

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

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


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

Спасибо.
VIT2708
Дата: 23.01.2013 11:39:17
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 забыл