Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что за странный баг? 
V
    Опции темы
Nickname
Дата 27.12.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Здравствуйте. пытаюсь выполнить следующий кусок кода, но мне выдается ошибка.
Цитата

Must declare the variable '@cityid'.

Что за баг??
Код

cmd.CommandText = "CREATE PROCEDURE SelectResumes" +
                " @start int, @count int, @cityid int " +
                " AS DECLARE @ciid NVarChar(255) " +
                
                " IF (@cityid=0) SET @ciid=''"+
                " ELSE SET @ciid=' AND cityid=@cityid'" + 
                " CREATE TABLE #tempresumes(" +
                " id int IDENTITY PRIMARY KEY, resumeid int)" +
                " INSERT INTO #tempresumes (resumeid)" +
                " exec ('SELECT resumeid FROM resumes WHERE 1=1' + @ciid)";
...
cmd.Parameters.Add(new SqlParameter("@cityid", SqlDbType.Int, 4));
cmd.Parameters["@cityid"].Value = cityid;


PM MAIL   Вверх
mr.DUDA
Дата 27.12.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Nickname, как насчёт объявить переменную cityid и присвоить ей значение?


--------------------
user posted image
PM MAIL WWW   Вверх
Nickname
Дата 27.12.2007, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(mr.DUDA @  27.12.2007,  12:55 Найти цитируемый пост)
Nickname, как насчёт объявить переменную cityid и присвоить ей значение? 

Но она же объявлена:
Код

...
" @start int, @count int, @cityid int " +
...

и присвоено ей значение:
Код

cmd.Parameters.Add(new SqlParameter("@cityid", SqlDbType.Int, 4));
cmd.Parameters["@cityid"].Value = cityid;

Если сделать так:
Код

...
" AS DECLARE @ciid NVarChar(255), @cityid int " +
...
, то появляется соощение:
Цитата

Procedure or function SelectResumes has too many arguments specified

PM MAIL   Вверх
mr.DUDA
Дата 27.12.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Сорри, не на то подумал.


--------------------
user posted image
PM MAIL WWW   Вверх
tol05
Дата 27.12.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



а cmd - это одна и та же команда? 


Это сообщение отредактировал(а) tol05 - 27.12.2007, 15:29


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Nickname
Дата 27.12.2007, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



та же, та же. И даже, если проверяю в sql query analizer-е, то The command(s) completed successfully.

Это сообщение отредактировал(а) Nickname - 27.12.2007, 15:42
PM MAIL   Вверх
Idsa
Дата 29.12.2007, 03:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(mr.DUDA @  27.12.2007,  12:55 Найти цитируемый пост)
Nickname, как насчёт объявить переменную cityid и присвоить ей значение? 

Цитата(Nickname @  27.12.2007,  13:09 Найти цитируемый пост)
Но она же объявлена:

Хм... Она объявлена в SQL-запросе. А в самой программе ее объявления я на заметил.

Цитата(Nickname @  27.12.2007,  13:09 Найти цитируемый пост)
cmd.Parameters["@cityid"].Value = cityid;

Покажите строчку в программе, где объявлена переменная cityId.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Nickname
Дата 29.12.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата

Покажите строчку в программе, где объявлена переменная cityId.

Да, нет она объявлена - передается в функцию через параметры, и значение её установлено
PM MAIL   Вверх
Idsa
Дата 29.12.2007, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(Nickname @  29.12.2007,  13:21 Найти цитируемый пост)
Да, нет она объявлена - передается в функцию через параметры, и значение её установлено 

Тогда выложите побольше кода. Можно и вообще весь проект.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Nickname
Дата 29.12.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(Idsa @  29.12.2007,  14:28 Найти цитируемый пост)
Тогда выложите побольше кода. Можно и вообще весь проект. 

Весь проект конечно выкладывать не буду (если конечно не потребуете), но вот код функции...
Код

public DataSet SelectResumes(int categoryid, int cityid, string city, string age, string ageto, int education, int experience, string salary,int sex, int schedule, int employment, string words, int srok, int topage, int start, int pnumber)
    {
        SqlConnection cn = new SqlConnection(cs);
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = cn;
        cmd.CommandText = "IF EXISTS (SELECT name FROM sysobjects WHERE name = 'SelectResumes' AND type = 'P') DROP PROCEDURE SelectResumes";
        cn.Open();
        cmd.ExecuteNonQuery();
              

        cmd.CommandText = "CREATE PROCEDURE SelectResumes" +
                " @start int, @count int, @cityid int " +
                " AS DECLARE @ciid NVarChar(255) " +
                
                " IF (@cityid=0) SET @ciid=''"+
                " ELSE SET @ciid=' AND cityid=@cityid'" + 
                " CREATE TABLE #tempresumes(" +
                " id int IDENTITY PRIMARY KEY, resumeid int)" +
                " INSERT INTO #tempresumes (resumeid)" +
                " exec ('SELECT resumeid FROM resumes WHERE 1=1' + @ciid);" +
                
                " DECLARE @fromid int" +
                " DECLARE @toid int" +
                " SET @fromid=@start SET @toid=@start+@count-1" +

                " SELECT r.resumeid,  " +
                    " appointment, r.cityid, ci.city, othercity, "+
                    " CAST( sex AS NVarChar(1)) AS sex, "+
                    " age, "+
                    " CAST( education AS NVarChar(1)) AS education, " +
                    " CAST( experience AS NVarChar(1)) AS experience, " +
                    " CAST( schedule AS NVarChar(1)) AS schedule, " +
                    " salary, "+
                    " skills,  "+
                    " addtime,  "+
                    " r.categoryid,  "+
                    " cat.category,  "+
                    " CAST( employment AS NVarChar(1)) AS employment, " +
                    " education_t,  "+
                    " experience_t, "+
                    " name, "+
                    " phone, "+
                    " email" +
                " FROM resumes r, cities ci, categories cat, #tempresumes tr" +
                " WHERE r.cityid=ci.cityid AND r.categoryid=cat.catid " +
                " AND tr.resumeid=r.resumeid"+
                " AND tr.id>=@fromid AND tr.id<=@toid";
        cmd.ExecuteNonQuery();

        cmd.CommandText = "SelectResumes";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@start", SqlDbType.Int, 4));
        cmd.Parameters["@start"].Value = start;
        cmd.Parameters.Add(new SqlParameter("@count", SqlDbType.Int, 4));
        cmd.Parameters["@count"].Value = pnumber;

        cmd.Parameters.Add(new SqlParameter("@cityid", SqlDbType.Int, 4));
        cmd.Parameters["@cityid"].Value = cityid;
        
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();

        try
        {
            da.Fill(ds);
            return ds;
        }
        catch (SqlException ex)
        {
            throw new ApplicationException(ex.Message);
            return null;
        }
        finally
        {
            cn.Close();
        }
    }



Это сообщение отредактировал(а) Nickname - 29.12.2007, 18:18
PM MAIL   Вверх
mr.DUDA
Дата 29.12.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



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


--------------------
user posted image
PM MAIL WWW   Вверх
thomas
Дата 29.12.2007, 20:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



Nickname, 
Приветствую.
Напиши sql файлик с текстом
Код

CREATE PROCEDURE SelectResumes
                 @start int, 
                 @count int, 
                 @cityid int 
AS 
    DECLARE @ciid NVarChar(255) 
                
                 IF (@cityid=0) SET @ciid=''
                 ELSE SET @ciid=' AND cityid=@cityid' 
                CREATE TABLE #tempresumes ( 
                   id int IDENTITY PRIMARY KEY, resumeid int)
                INSERT INTO #tempresumes (resumeid)
                exec ('SELECT resumeid FROM resumes WHERE 1=1' + @ciid);
                
                DECLARE @fromid int
                DECLARE @toid int
                SET @fromid=@start SET @toid=@start+@count-1
                SELECT r.resumeid,  
                    appointment, r.cityid, ci.city, othercity, 
                    CAST( sex AS NVarChar(1)) AS sex, 
                    age, 
                    CAST( education AS NVarChar(1)) AS education, 
                    CAST( experience AS NVarChar(1)) AS experience, 
                    CAST( schedule AS NVarChar(1)) AS schedule, 
                    salary, 
                    skills,  
                    addtime,  
                    r.categoryid,  
                    cat.category,  
                    CAST( employment AS NVarChar(1)) AS employment, 
                    education_t,  
                    experience_t, 
                    name, 
                    phone, 
                    email
                FROM resumes r, cities ci, categories cat, #tempresumes tr
                WHERE r.cityid=ci.cityid AND r.categoryid=cat.catid 
                AND tr.resumeid=r.resumeid"
                AND tr.id>=@fromid AND tr.id<=@toid

и выполни его на своем сервере.
Интересно что скажет Management Studio по поводу синтаксиса? И создаст ли сервер такую хранимую процедуру?
Если это произойдет, то у тебя в БД будет ХП.
Там же из студии попробуй выполнить её. И посмотри какие ошибки тебе выдаст сервер.(если выдаст конечно)
А может и все будет хорошо: синтаксис верный, ХП создалась, параметры для нее нормальные и она выполниться как ты задумал.

И еще параметры для ХП в C# лучше задавать методом AddWithValue("@имя параметра", значение параметра)

Успехов.  smile 

ЗЫ и проверь внимательно что ты написал в запросе, по моему у тебя там несколько ошибок с одинарными кавычками.
ЗЫЗЫ и как можно присвоить значение ciid=' ' ? Id по любому не может быть ничем(нулем), я так думаю.

Добавлено через 4 минуты и 32 секунды
Nickname, 
Что означает вот эта запись в твоем запросе? 
Код

" ELSE SET @ciid=' AND cityid=@cityid'"




--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Nickname
Дата 3.1.2008, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(thomas @  29.12.2007,  20:25 Найти цитируемый пост)
Напиши sql файлик с текстом

Надо попробовать, но смогу это делать только после праздников - проект весь на работе

[quote=thomas, 29.12.2007,  20:25, post1365160]
Что означает вот эта запись в твоем запросе? 
Код

" ELSE SET @ciid=' AND cityid=@cityid'"[/quote]

Смысл этого в том, что пользователь может вести поиск по городу, т.е. он может выбрать все города или один конкретный. Если выбраны все города, то поиск по городу не происходит и строка запроса принимает такой вид:
Код

SELECT resumeid FROM resumes WHERE 1=1

, а если выбран конкретный город, то такой вид:
Код

SELECT resumeid FROM resumes WHERE 1=1' + @ciid

, где @ciid и равно 
Код

AND cityid=@cityid

Я конечно понимаю что это не идеальный вариант, но пока лучше ничего не придумал
PM MAIL   Вверх
1stain
Дата 3.1.2008, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 5
Всего: 40



попробуй так (без темповых таблиц)
Код

SELECT TOP @count
...
FROM resumes r, categories cat, 
                WHERE r.categoryid=cat.catid 
                AND tr.id >= @fromid
                AND r.cityid in ( SELECT
                                       (CASE 
                                             WHEN @cityid = 0 THEN (SELECT id from cities)
                                             ELSE (SELECT @cityid)
                                         END)
                                  )


не работает ((

Это сообщение отредактировал(а) 1stain - 3.1.2008, 23:11


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
Nickname
Дата 9.1.2008, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Просто поменял строку
Код

ELSE SET @ciid=' AND cityid=@cityid'

на
Код

ELSE SET @ciid=' AND cityid='+ CAST(@cityid AS NVarChar(5))

и все заработало. Спасибо всем за участие
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0587 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.