Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2012, 09:34   #1
Claster
Форумчанин
 
Аватар для Claster
 
Регистрация: 02.09.2008
Сообщений: 340
По умолчанию MsSql добавление параметров в запрос

Всем привет. Необходимо добавить в запрос произвольное кол-во параметров. На форме GridView с чекбоксами, пользователь выбрал необходимые записи, нажал на кнопку и надо что бы в запрос передались параметры которые он выбрал.

Например в GridView 25 записей и у каждой показывается ее номер, пользователь выбрал скажи 15 записей, и нажал на кнопку, надо что бы в запрос передались эти 15 параметров со своими номерами

Не очень хотелось бы приходить к данному способу т.к тут указано статическое кол-во параметров =(. Пока в голову ничего не пришло

Код:
Field1 IN (@param1,@param2,@param3,@param4,@param5,@param6,@param7,@param8,@param9,@param10)
Цитата:
- Только сисадмин может попросить у начальства 20$ на память...
Claster вне форума Ответить с цитированием
Старый 09.08.2012, 09:55   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Я в таких случаях создаю на сервере временную таблицу с одним полем и записую туда перечень значений. Сам запрос к основной таблице выглядит примерно так
Код:
SELECT T.* FROM MyTable T,#TempTable U WHERE T.MyId=U.Value
Чем больше значений в списке, тем это работает быстрее чем IN (). Не стоит забывать, что IN почти тоже самое, что Field1=1 or Field1=12 or ... со всеми вытекающими последствиями
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.08.2012, 10:10   #3
Claster
Форумчанин
 
Аватар для Claster
 
Регистрация: 02.09.2008
Сообщений: 340
По умолчанию

а как это? Сначала вы используете один CommandText для записи во временную таблицу и выполняете этот запрос а затем другой CommandText для выборки данных уже?
Цитата:
- Только сисадмин может попросить у начальства 20$ на память...

Последний раз редактировалось Claster; 09.08.2012 в 10:15.
Claster вне форума Ответить с цитированием
Старый 09.08.2012, 10:20   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Лучше всего сделать пользовательскую процедуру с двумя параметрами - именем временной таблицы и перечнем значений и вызывать её. Пусть она и создает временную таблицу. Для 2000-го длина символьного параметра до 8000, так что уместится достаточно длинный список. После создания обычные средства для SELECT-а
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.08.2012, 10:24   #5
Claster
Форумчанин
 
Аватар для Claster
 
Регистрация: 02.09.2008
Сообщений: 340
По умолчанию

Надо так сделать?
Код:
cmd.CommandText = @"Create table #tmpTable (numberParam int)";
cmd.CommandTimeout = 999999;
                cmd.Connection = con;
                da = new SqlDataAdapter(cmd);
                da.Fill(ds);
                con.Open();
                cmd.ExecuteNonQuery();

cmd.CommandText = @"insert into #tmpTable (numberParam) VALUES (1)";
cmd.CommandTimeout = 999999;
                cmd.Connection = con;
                da = new SqlDataAdapter(cmd);
                da.Fill(ds);
                //con.Open();
                cmd.ExecuteNonQuery();

cmd.CommandText = @"Select * from Table where field1 in (Select * from #tmpTable)";
                cmd.CommandTimeout = 999999;
                cmd.Connection = con;
                da = new SqlDataAdapter(cmd);
                da.Fill(ds);
                //con.Open();
                cmd.ExecuteNonQuery();
                GV.DataSource = ds;
                GV.DataBind();
                con.Close();
и все это по нажатию одной кнопки?
Цитата:
- Только сисадмин может попросить у начальства 20$ на память...

Последний раз редактировалось Claster; 09.08.2012 в 10:34.
Claster вне форума Ответить с цитированием
Старый 09.08.2012, 10:27   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно и так, только лучше
Код:
Select T.* from Table T,#tmpTable U where T.field1=U.numberParam
Временную таблицу желательно удалить, что бы в этом сеансе в следующий раз не нарваться на такое же имя
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.08.2012 в 10:29.
Аватар вне форума Ответить с цитированием
Старый 09.08.2012, 11:47   #7
Claster
Форумчанин
 
Аватар для Claster
 
Регистрация: 02.09.2008
Сообщений: 340
По умолчанию

Еще где то затупил, не получается вставить данные в цикле

Код:
              foreach (GridViewRow rowItem in GV.Rows)
                {
                    chk = (CheckBox)(rowItem.Cells[6].FindControl("ChB1"));
                    if (chk.Checked)
                    {
                        cmd.CommandText = @"insert into #tmpTable (numberParam) VALUES (@paramNumber)";
                        Label numberTT = (Label)rowItem.FindControl("NumberRow");//считываем данные из Lable в гриде
                        list.Add(Convert.ToInt32(numberTT.Text));//заносим в список
                        cmd.Parameters.Add("@paramNumber", SqlDbType.Int);//добавляем параметр
                        cmd.Parameters["@paramNumber"].Value = list[numParam - 1];//устанавливаем значение для параметра
                        numParam++;

                        cmd.CommandTimeout = 999999;
                        cmd.Connection = con;
                        da = new SqlDataAdapter(cmd);
                        da.Fill(ds);
                        //con.Open();
                        cmd.ExecuteNonQuery();
                    }
                }
Цитата:
- Только сисадмин может попросить у начальства 20$ на память...

Последний раз редактировалось Claster; 09.08.2012 в 11:52.
Claster вне форума Ответить с цитированием
Старый 09.08.2012, 12:04   #8
Claster
Форумчанин
 
Аватар для Claster
 
Регистрация: 02.09.2008
Сообщений: 340
По умолчанию

Вопрос решен и в принципе он очевиден =)

Код:
            cmd.CommandText = @"insert into #tmpTable (numberParam) VALUES (@paramNumber)";
            cmd.Parameters.Add("@paramNumber", SqlDbType.Int);

                foreach (GridViewRow rowItem in GV.Rows)
                {
                    chk = (CheckBox)(rowItem.Cells[6].FindControl("ChB1"));
                    if (chk.Checked)
                    {
                       
                        Label numberTT = (Label)rowItem.FindControl("NumberRow");
                        list.Add(Convert.ToInt32(numberTT.Text));
                        cmd.Parameters["@paramNumber"].Value = list[numParam - 1];
                        numParam++;

                        cmd.CommandTimeout = 999999;
                        cmd.Connection = con;
                        da = new SqlDataAdapter(cmd);
                        da.Fill(ds);
                        //con.Open();
                        cmd.ExecuteNonQuery();
                    }
                }
Цитата:
- Только сисадмин может попросить у начальства 20$ на память...
Claster вне форума Ответить с цитированием
Старый 09.08.2012, 12:25   #9
Claster
Форумчанин
 
Аватар для Claster
 
Регистрация: 02.09.2008
Сообщений: 340
По умолчанию

при использовании подобной конструкции происходит задвоение данных, почему?

Distinct не помог

Код:
Select T.* from Table T,#tmpTable U where T.field1=U.numberParam
Цитата:
- Только сисадмин может попросить у начальства 20$ на память...
Claster вне форума Ответить с цитированием
Старый 09.08.2012, 12:29   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Скорее всего во временную таблицу записали дважды список.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос на добавление Slame Помощь студентам 4 20.11.2011 23:01
Запрос на добавление Slame Microsoft Office Access 3 15.11.2011 11:24
Параметрический запрос с использованием 2 и более параметров Nurik27 БД в Delphi 2 23.04.2011 12:09
Запрос на добавление Grushka Microsoft Office Access 3 03.05.2010 10:00
Добавление (запрос) warshadow Microsoft Office Access 8 23.10.2009 01:15