WEB форумы на jedi
[Форум] [Помощь] [Поиск] [Выйти]
Добро пожаловать, [info]User

WEB форумы на jedi [ПОИСК] [Архив до 03.2006]

Тема Char и хранимая процедура в SQL К предыдущему сообщению На следующее сообщение Программирование

Отправил Snam в 23:09 06.11.2005[Ответить]
Суть в следующем: есть хранимая процедура, которая добавляет запись в таблицу.

СREATE PROCEDURE Countries_Add

@Key_C text = NULL,
@Name_C text = NULL

AS
if  (@Key_C is NULL) or (@Name_C is NULL)
Begin
RAISERROR ('Не все параметры заданы',16,1)
return (-2)
End
insert into Countries (Key_C, Name_C) values (@Key_C, @Name_C)

Так она позволяет её сохранять и не ругается на синтаксические ошбики. Если же на третей строчке написать
@Key_C char = NULL - тогда ругается так: parameter '@Key_C'  has an invalid data type.

Это что такое? Точнее, что это такое я понимаю, но как с этим бороться - не знаю.
Впринципе, что этот Key_C можно и текстовым оставить, но не сильно хочется кучу таблиц и кучу записей в них переписывать, потому что во всех таблицах придется менять тип Key_C и, соответственно, данные потеряются.


Отправил Пaшкa в 12:49 07.11.2005[Ответить]
@Key_C char(20) = NULL

Просто тип char должен иметь длину, наверное. Не проверял. Не помню, правильный ли это синтаксис.


Отправил CAHbKA в 13:46 07.11.2005[Ответить]
и дополнительно статья "CAST and CONVERT" в книжке Transact-SQL Reference


Отправил Пaшкa в 14:28 07.11.2005[Ответить]
По поводу "не проверял". Просто сталкивался по работе, когда varchar вполне нормально проходит без указания длины, но обрезается до 1 символа. Использовалось параметром.


Отправил Snam в 00:27 08.11.2005[Ответить]
Переделал ваще все :) Сократил до минимума и оставил тип варчар. Теперь выглдяит так:

CREATE PROCEDURE Countries_Add
@Key_C varchar(50),
             @Name_C text
AS
INSERT Countries (Key_C, Name_C) VALUES (@Key_C, @Name_C)
GO

дальше есть две формы (делфи): на первой есть кнопка "добавить" и к ней адосторепроц. По нажатию вылезает вторая форма на которой два едита и кнопка ок. В Едиты забиваются значения полей и потом по ок:
Form1.ADOStoredProc2.Parameters.ParamByName('@Key_C').value:=Edit1.text;

Form1.ADOStoredProc2.Parameters.ParamByName('@Name_C').value:=Edit2.text

Вылетает ошибка и говорит, что параметр Key_C не найден.

Уже три часа сижу парюсь. Ответ как всегда просто :) Кто-то знает?


Отправил Patrol в 15:09 08.11.2005[Ответить]
Так посмотри коллекцию параметров-то.. какие и какого типа он видит... Для этого дебаггер и придумали :)


Отправил Пaшкa в 16:10 08.11.2005[Ответить]
Наверное @Key_C не нужно, а просто Key_C в коде. Хотя в C#, допустим, нужно. Правда, посмотри коллекцию параметров просто, в режиме отладки.

А вообще char и varchar всё же разные типы. Ты бы документацию на типы MSSql почитал, зачем использовать тот или иной, и т.п.

Посмотри готовые примеры, и сделай так же.


Отправил Snam в 02:47 10.11.2005[Ответить]
Что подразумевается под кллекцией параметров? Свойство "Parameters" компонента AdoStoreProc? Так там все как нужно, в данном случае три параметра @Key_C, @Name_C, @ReturnValue.

Вообщем уже Key_C переделал в тип инт и сделал счетчиком, он автоматом увиличивается на 1. Остался только @Name_C

Теперь ошибка не вылетает (сначала вылетала - не знаю, что сделал, вроде ничего и не ковырял). но в базу запись не добавляет. Хотя по идее после ввода названия страны он должен увеличить поле Key_C на 1 и автоматом добавить новое название страны.

Народ. не могу уже больше. Неужели придется делать пошло через дбнавигатор? Не хочется, да и требуется по нормальному.


Отправил CAHbKA в 11:06 10.11.2005[Ответить]
вас трудно понимать

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

к примеру - вы уверены, что умеете работать с АДО , а данные в процедуру не приходят. это повод начать проверять себя.
1. процедура сама по себе добавляет данные?
  1а. в любом случае сделать в ней отладку - печать входных параметров, результатов вставки, печать ошибок. явно приводить типы.
2. проверить данные перед передачей в процедуру, т.е. распечатать то, что туда передаём. у вас это называется Form1.ADOStoredProc2.Parameters.ParamByName('@Key_C').value:=Edit1.text;
  проверить типы, явно привести типы к ожидаемым в процедуре
3. проверить форму. туда ли сохраняем ввод.

где-то вы себя за руку и поймаете по дороге.


Отправил Snam в 02:37 11.11.2005[Ответить]
Все оказалось гораздо проще. Я ж говорил, все просто :)
Кто догадается в течении дня 11 ноября - подарю бутыль шампанского советского (сладкое или полусладкое - выберете сами) :))


Отправил CAHbKA в 02:52 11.11.2005[Ответить]
не то чтобы хотел или стал бы пить шампанское, но это были перекур и недосып Ж)

__
шампанское можно отнести девушкам в www.секцию ;-)


Отправил Sleep-Walker в 21:31 11.11.2005[Ответить]
или один из его вариаций - кривой копипэйст))


Отправил Snam в 13:07 12.11.2005[Ответить]
Внимание, правильный ответ:
надо было написать по кнопке "ОК": Form1.AdoStoredProcedure2.Parameters.refresh;
Form1.ADOStoredProc2.Parameters.ParamByName('@Key_C').value:=Edit1.text;
Form1.ADOStoredProc2.Parameters.ParamByName('@Name_C').value:=Edit2.text
Form1.AdoStoredProcedure2.ExecProc

Вот и все :)
Никто не выиграл бутыль шампанского :) А по поводу девушек из клуба секции - подумаю, ибо они хорошие и для них не жалко :)


Отправил CAHbKA в 15:32 12.11.2005[Ответить]
третий раз подряд попала на кидалово
шарик ты балбес

:-)


Отправил Patrol в 20:25 15.11.2005[Ответить]
Надо просто всегда делать все последовательно. И отделять мух от котлет :)

1. Делаем DataLayer, тестируем.
2. Делаем логику, которая юзает DataLayer, тестируем.
3. Делаем UI, который юзает логику, тестируем.

После пункта 3. приходим к тому, что у нас нигда и никогда просто не может встретиться _обработчик события_, который содержит мешанину всего сразу, типа Form1.ADOStoredProc2.Parameters.ParamByName('@Key_C').value:=Edit1.text;

Точно так же как и не будет забываться рефреш в каждом новом обработчике, не будет великолепного "программирования методом копи-пейст", не будет описанного геморроя с поиском наизауряднейшей ошибки в течении нескольких дней :)
Ну и "третьего раза на кидалово" не будет тоже :)


Отправил Пaшкa в 23:57 15.11.2005[Ответить]
Лешь, в данном случае "правильные" (тыщу людей поспорят и по этому поводу) и проверенные методы программирования здесь не помогут.


Отправил Patrol в 22:52 16.11.2005[Ответить]
Я не сказал "правильные", я сказал "последовательные" - разница есть ;)
А если и не помогут - то только при отсутствии желания избавиться от геморроя, я думаю..
Ну да ладно..