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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2008, 20:15   #1
Шани
Пользователь
 
Регистрация: 25.07.2007
Сообщений: 12
По умолчанию 2 проблемы: вставка в ADODataset и с ADOQuery

Доброго времени суток!
Пишу приложение для бд "Видеоархив", созданной на sql server. Есть таблица "Sources"(SourceID,SourceName,Sourc eTypeID) и "SourceTypes"(SourceTypeID,SourceTy peName), связанные по полю SourceTypeID. В датамодуль для них брошены адодатасеты и датасурсы. На форме fmSources лежит dbgrid, привязанный к датасурсу dsSources, TEdit для ввода SourceName и TDBLookupCombobox, привязанный к датасурсу dsSourceTypes, для указания SourceType (к слову, сначала вместо него был обычный комбобокс, записи в который заносились программно, но так мне что-то не понравилось). При попытке добавить запись дэльфи выдает ошибку: "ошибка неизвестного типа". Вот кусок кода:
Код:
If Not Exist Then //до этого идет проверка, существует ли уже такая запись
              Begin
                Insert;
                FieldByName('SourceName').AsString := eSourceName.Text;
                FieldByName('SourceTypeID').AsInteger := DBLookupCombobox1.KeyValue;
                Post;
              End
            Else MessageDlg('Такой носитель уже существует!',mtError,[mbOk],0);
Вторая проблема связана с поиском по нескольким параметрам. Есть ADOQuery с Parameters[0 - p, 1 - Clip, 2 - Category, 3 - Author, 4 - Director, 5 - Member]. Код следующий:

Код:
DataModuleVA.ADOQSearch.Active := False;
            DataModuleVA.ADOQSearch.SQL.Clear;
            st := 'select * from '+
            'ClipsMembers, Clips, Categories, Authors, Directors, Members '+
            'where '+
            '(ClipsMembers.ClipID=Clips.ClipID) And '+
            '(ClipsMembers.MemberID=Members.MemberID) And '+
            '(Clips.CategoryID=Categories.CategoryID) And '+
            '(Clips.AuthorID=Authors.AuthorID) And '+
            '(Clips.DirectorID=Directors.DirectorID) And '+
            '(Clips.ClipName=:Clip) And '+
            '(Categories.CategoryName=:Category) And '+
            '(Authors.AuthorLName=:Author) And '+
            '(Directors.DirectorLName=:Director) And '+
            '(Members.MemberLName=:Member)';
            If chbSort.Checked Then st := st+' order by ClipName asc';
            DataModuleVA.ADOQSearch.SQL.Text := st;
            DataModuleVA.ADOQSearch.Parameters.ParseSQL(DataModuleVA.ADOQSearch.SQL.Text,True);
            DataModuleVA.ADOQSearch.Parameters[1].Value := eClipName.Text;
            DataModuleVA.ADOQSearch.Parameters[2].Value := combCategory.Text;
            DataModuleVA.ADOQSearch.Parameters[3].Value := combAuthorLName.Text;
            DataModuleVA.ADOQSearch.Parameters[4].Value := combDirectorLName.Text;
            DataModuleVA.ADOQSearch.Parameters[5].Value := combMemberLName.Text;
Вылетает с ошибкой List Index out of bounds(5)

Помогите, пожалуйста, разобраться в этих прискорбных проблемах.
Заранее прошу прощения, если подобное уже где-то обсуждалось, а я не нашла, оправданием мне может послужить лишь медленный и печальный интернет, в сравнении с которым похоронный марш покажется зажигательным фолком. В этом случае большая просьба дать ссылки на эти обсуждения.
Шани вне форума Ответить с цитированием
Старый 19.07.2008, 21:05   #2
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Цитата:
Сообщение от Шани Посмотреть сообщение
При попытке добавить запись дэльфи выдает ошибку: "ошибка неизвестного типа".
Прямо так и выдает "ошибка неизвестного типа"?
1) Дословно можете привести сообщение об ошибке?
2) Каким образом у вас организовано вычисление очередного id для новой строки?
edgy вне форума Ответить с цитированием
Старый 19.07.2008, 21:42   #3
Шани
Пользователь
 
Регистрация: 25.07.2007
Сообщений: 12
По умолчанию

1. Так и выдает (сама первый раз такое вижу). Дословно:
"Project prVideoArchive.exe raised exception class EOleException with message 'Ошибка неизвестного типа'. Process stopped. Use Step or Run to continue."
2. Эмм... id - автоинкрементное поле, т.е. еще на этапе создания таблицы в sql server'e я указывала у него identity specification (increment = 1, seed = 1)
Шани вне форума Ответить с цитированием
Старый 19.07.2008, 21:51   #4
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Цитата:
Сообщение от Шани Посмотреть сообщение
Эмм... id - автоинкрементное поле, т.е. еще на этапе создания таблицы в sql server'e я указывала у него identity specification (increment = 1, seed = 1)
Понятно. Просто у меня другой подход - я сам вычисляю очередное значение id для новой строки. Поэтому у меня и возник вопрос по этом у поводу.

Попробуйте вместо применения insert и post сделать вставку новой записи запросом. Т.е. "insert into table .... values ( .... )".
Кстати в Query Analyzer сам запрос на вставку новой записи нормально проходит?
edgy вне форума Ответить с цитированием
Старый 21.07.2008, 18:59   #5
Шани
Пользователь
 
Регистрация: 25.07.2007
Сообщений: 12
По умолчанию

Что-то не получается. Может, я неправильно делаю?
Код:
Код:
ADOQuery1.SQL.Clear;
                ADOQuery1.SQL.Add('Insert Into Table Sources(SourceName,SourceTypeID) Values('+eSourceName.Text+','+DBLcbSourceType.KeyValue+')');
                ADOQuery1.ExecSQL;
                ADOQuery1.Close;
А что насчет второй проблемы?
Шани вне форума Ответить с цитированием
Старый 22.07.2008, 08:29   #6
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Цитата:
Сообщение от Шани Посмотреть сообщение
Что-то не получается. Может, я неправильно делаю?
Попробуйте тоже самое, но с использованием параметров.
ADOQuery1.Parameters.ParamByName('p aram').Value := ...


Цитата:
Сообщение от Шани Посмотреть сообщение
А что насчет второй проблемы?
Код:
DataModuleVA.ADOQSearch.Parameters[1].Value := eClipName.Text;   
DataModuleVA.ADOQSearch.Parameters[2].Value := combCategory.Text;   
DataModuleVA.ADOQSearch.Parameters[3].Value := combAuthorLName.Text;   
DataModuleVA.ADOQSearch.Parameters[4].Value := combDirectorLName.Text;   
DataModuleVA.ADOQSearch.Parameters[5].Value := combMemberLName.Text;
Вылетает с ошибкой List Index out of bounds(5)
Индексы параметров вроде бы как с 0 ( нуля ) начинаются.
Используйте ParamByName
edgy вне форума Ответить с цитированием
Старый 22.07.2008, 09:58   #7
Mitriy08
Пользователь
 
Регистрация: 11.07.2008
Сообщений: 91
По умолчанию

Цитата:
ADOQuery1.SQL.Add('Insert Into Table Sources(SourceName,SourceTypeID) Values('+eSourceName.Text+','+DBLcb SourceType.KeyValue+')');
Ошибка скорее всего в этом предложении..
На скока я понимаю поле в таблице SourceName - текстовое, а SourceTypeID - инт, если это так, то eSourceName.Text - это дело надо брать в кавычки. Тобиш у тя в итоге должен получистя запрос:

Код:
Insert Into Table Sources(SourceName,SourceTypeID) Values('My_Name',123)
попробуй написать так:
Код:
ADOQuery1.SQL.Add('Insert Into Table Sources(SourceName,SourceTypeID) Values('''+eSourceName.Text+''','+DBLcbSourceType.KeyValue+')');
Mitriy08 вне форума Ответить с цитированием
Старый 22.07.2008, 17:05   #8
Шани
Пользователь
 
Регистрация: 25.07.2007
Сообщений: 12
По умолчанию

edgy, нулевой параметр у меня используется в другом запросе, поэтому его здесь нет. Вообще, что бы я с параметрами не делала, как только их больше одного, сразу вылетает эта ошибка. А насчет ParamByName дэльфи говорит, что не знает такого свойства у adoquery.
Mitriy08, сейчас попробую... *с этими кавычками с ума можно сойти :/*
Шани вне форума Ответить с цитированием
Старый 22.07.2008, 17:35   #9
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Цитата:
Сообщение от Шани Посмотреть сообщение
А насчет ParamByName дэльфи говорит, что не знает такого свойства у adoquery.
Не может быть. У меня почему-то знает.
Код:
ADOQuery1.Parameters.ParamByName('param').Value
У вас заданы 5 параметров. Их отсчет начинается с 0. Т.е. последний параметр - 4 по счету. У вас последний - пятый. Отсюда и ошибка - " List Index out of bounds(5)". Поэтому чтобы не заморачиваться с обращением к параметру по его индексу ( и соответственно не натыкаться на соответствующего рода ошибки ) можно использовать обращение к параметру по его имени ( ParamByName ). Так более понятнее на мой взгляд. Да я думаю непросто догадаться, что означает третий параметр ( Parameters[2] ), но ParamByName('name') - более понятно.
edgy вне форума Ответить с цитированием
Старый 22.07.2008, 18:30   #10
Шани
Пользователь
 
Регистрация: 25.07.2007
Сообщений: 12
По умолчанию

Цитата:
Не может быть. У меня почему-то знает.
Это я туплю... нашла, все заработало. А с номерами параметров: т.е. нельзя объявить, скажем, 6 параметров, и при этом первый(в смысле нулевой) не использовать в этом запросе, а использовать в другом? Странно как-то. Ну да ладно. Спасибо за помощь!
Осталось разобраться с добавлением, потому что доп. кавычки не помогли: пишет все ту же ошибку: Could not convert variant of type(string) into type (double). Сейчас попробую через параметры
Шани вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
метод Close для ADODataSet вызывает ошибку 'BOF или EOF имеет ...' (mdac 6.0) jane БД в Delphi 1 16.07.2008 07:34
ошибка с FilterOptions в ADODataSet (FilterOption are not suppoted) VVk БД в Delphi 2 08.12.2007 17:00
свойство ADOdataSET.CommandTimeout не работает _liv_ БД в Delphi 0 30.10.2007 14:54
ADODataSet: cannot modify a read-only dataset cvetochek Помощь студентам 2 29.10.2007 14:49
idudpserver+mssql+adodataset vodila БД в Delphi 1 11.08.2007 09:56