[Форум] [Помощь] [Поиск] [Выйти] |
Добро пожаловать, ![]() |
|
|
| ||
Суть в следующем: есть хранимая процедура, которая добавляет запись в таблицу. С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 и, соответственно, данные потеряются. |
| ||
@Key_C char(20) = NULL Просто тип char должен иметь длину, наверное. Не проверял. Не помню, правильный ли это синтаксис. |
| ||
и дополнительно статья "CAST and CONVERT" в книжке Transact-SQL Reference |
| ||
По поводу "не проверял". Просто сталкивался по работе, когда varchar вполне нормально проходит без указания длины, но обрезается до 1 символа. Использовалось параметром. |
| ||
Переделал ваще все :) Сократил до минимума и оставил тип варчар. Теперь выглдяит так: 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 не найден. Уже три часа сижу парюсь. Ответ как всегда просто :) Кто-то знает? |
| ||
Так посмотри коллекцию параметров-то.. какие и какого типа он видит... Для этого дебаггер и придумали :) |
| ||
Наверное @Key_C не нужно, а просто Key_C в коде. Хотя в C#, допустим, нужно. Правда, посмотри коллекцию параметров просто, в режиме отладки. А вообще char и varchar всё же разные типы. Ты бы документацию на типы MSSql почитал, зачем использовать тот или иной, и т.п. Посмотри готовые примеры, и сделай так же. |
| ||
Что подразумевается под кллекцией параметров? Свойство "Parameters" компонента AdoStoreProc? Так там все как нужно, в данном случае три параметра @Key_C, @Name_C, @ReturnValue. Вообщем уже Key_C переделал в тип инт и сделал счетчиком, он автоматом увиличивается на 1. Остался только @Name_C Теперь ошибка не вылетает (сначала вылетала - не знаю, что сделал, вроде ничего и не ковырял). но в базу запись не добавляет. Хотя по идее после ввода названия страны он должен увеличить поле Key_C на 1 и автоматом добавить новое название страны. Народ. не могу уже больше. Неужели придется делать пошло через дбнавигатор? Не хочется, да и требуется по нормальному. |
| ||
вас трудно понимать совет - делайте простые тесткейсы, работа которых понятна, логика может быть перенесена в реальный проект, а реализация показывает что не так. к примеру - вы уверены, что умеете работать с АДО , а данные в процедуру не приходят. это повод начать проверять себя. 1. процедура сама по себе добавляет данные? 1а. в любом случае сделать в ней отладку - печать входных параметров, результатов вставки, печать ошибок. явно приводить типы. 2. проверить данные перед передачей в процедуру, т.е. распечатать то, что туда передаём. у вас это называется Form1.ADOStoredProc2.Parameters.ParamByName('@Key_C').value:=Edit1.text; проверить типы, явно привести типы к ожидаемым в процедуре 3. проверить форму. туда ли сохраняем ввод. где-то вы себя за руку и поймаете по дороге. |
| ||
Все оказалось гораздо проще. Я ж говорил, все просто :) Кто догадается в течении дня 11 ноября - подарю бутыль шампанского советского (сладкое или полусладкое - выберете сами) :)) |
| ||
не то чтобы хотел или стал бы пить шампанское, но это были перекур и недосып Ж) __ шампанское можно отнести девушкам в www.секцию ;-) |
| ||
или один из его вариаций - кривой копипэйст)) |
| ||
Внимание, правильный ответ: надо было написать по кнопке "ОК": 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 Вот и все :) Никто не выиграл бутыль шампанского :) А по поводу девушек из клуба секции - подумаю, ибо они хорошие и для них не жалко :) |
| ||
третий раз подряд попала на кидалово шарик ты балбес :-) |
| ||
Надо просто всегда делать все последовательно. И отделять мух от котлет :) 1. Делаем DataLayer, тестируем. 2. Делаем логику, которая юзает DataLayer, тестируем. 3. Делаем UI, который юзает логику, тестируем. После пункта 3. приходим к тому, что у нас нигда и никогда просто не может встретиться _обработчик события_, который содержит мешанину всего сразу, типа Form1.ADOStoredProc2.Parameters.ParamByName('@Key_C').value:=Edit1.text; Точно так же как и не будет забываться рефреш в каждом новом обработчике, не будет великолепного "программирования методом копи-пейст", не будет описанного геморроя с поиском наизауряднейшей ошибки в течении нескольких дней :) Ну и "третьего раза на кидалово" не будет тоже :) |
| ||
Лешь, в данном случае "правильные" (тыщу людей поспорят и по этому поводу) и проверенные методы программирования здесь не помогут. |
| ||
Я не сказал "правильные", я сказал "последовательные" - разница есть ;) А если и не помогут - то только при отсутствии желания избавиться от геморроя, я думаю.. Ну да ладно.. |