-
Доброго времени суток. Есть DBGrid связанный с ADOTable (БД в MSSQL 2000). Есть несколько lookup полей. Ошибка возникает при добавлении новой записи, точнее после ввода значения в любое поле. Если кратко: EOleException "Ошибка неизвестного типа". Если оставить только 1 lookup поле (любое) и начинать редактирование начинать с данного поля, то все проходит нормально. Мне кажется, что ошибка из-за того, что после заполнения любого поля происходит обновление (добовление новой) записи, а так как не все lookup поля заполнены, то появляется ошибка (хотя все поля в БД могут быть пустыми кроме id (первичный ключ)). Заранее благодарен.
-
> selyanin (26.06.2012 09:48:00) [0]
В dbgrid нет данных Table давно уже не используют, особенно с SQL серверами Неизвестная ошибка не имеет решения
-
> В dbgrid нет данных
прекрасно понимаю
> Table давно уже не используют, особенно с SQL серверами
раньше использовали и все работало
> Неизвестная ошибка не имеет решения
Есть какие-то предложения как более подробно конкретизировать ошибку для Вашего понимания?
А в целом, не понятно для чего был Ваш ответ.
-
> Неизвестная ошибка не имеет решения имеет... :), правда решать ее обычно нет нужды... при правильном написании (без ADOTable) с учетом что пишется все таки клиент сервер, а не файл сервер.
ADOTable может привести к подобному. если прикинуть как делается вставка для файл сервера, и как будет составлен запрос последующее на обновление, в худшем случае по всем значениям = NULL... от такого какая угодно ошибка может быть.
-
> Есть какие-то предложения как более подробно конкретизировать ошибку для Вашего понимания? код. "теоретизирования" в вопросах недопустимы.
-
> Есть какие-то предложения как более подробно конкретизировать > ошибку для Вашего понимания?
Не хочешь говорить, какая конкретно ошибок, можешь не говорит, но тогда чего ты от нас то хочешь, чтобы мы погадали?
-
> какая конкретно ошибок он ее привел - EOleException "Ошибка неизвестного типа". такая ошибка есть.
а вот от чего она конкретно... вопрос. кстати есть вариант, когда она "глушится" на этапе выполнения (т.е. обработка в компонентах такая - проигнорировать), и вылезает только в дебаге. без инфы, только по сообщения не точнее не сказать.
-
2 sniknik Лет 5 назад делал и все работало. Еще раз попробую объяснить задачу и проблему. Есть форма на ней DBGid и DBNavigator (прикрученные к ADOTable через DataSource). Если не использовать подставляемые поля все работает как положенно (добавляет, изменяет, удаляет). Если добавить ОДНО lookup поле то все кроме добовления так же отлично работает, добавить же можно только если первым внести значение у данного поля (подставляемого) иначе выскакивает ошибка. Если же ДВА и более lookup полей, то добавление вообще становится не возможным. Как я понимаю, проблема именно с подставляемыми полями, потому что стоит их исключить и все РАБОТАЕТ. Можно сделать дополнительные элементы формы и в них вносить данные для новой записи и через ADOQuery вставить новую запись, проверял все работает, но зачем лишние проблемы.
-
> [7] selyanin © (26.06.12 11:16) > Лет 5 назад делал и все работало.
Тебе говорят, как сделать правильно с TADODataset, а не через зад в смысле TADOTable. Тогда сам сможешь управлять поведением, а не полагаться на костыли.
-
> а не через зад в смысле TADOTable
Имхо и без DBNavigator.
-
> он ее привел - EOleException "Ошибка неизвестного типа".
Тогда я невнимательно читал. Но MS SQL это OLE и оно проблематично с Table и SQL
-
> проблема именно с подставляемыми полями да, скорее всего так и есть (как представляю), т.к. при обновлении получается неопределенность - какую из записей, по какому полю обновлять... был бы TADODataset с той же проблемой, можно было бы указать поле обновления/главную таблицу/даже запрос на обновление записи... а вот с ADOTable облом`с... и не потому что нельзя, а потому что мне например влом что-то объяснять при ТАКОМ баге (ADOTable), к тому же еще придумывать как сделать через "Ж" и + понятно тебе.
> но зачем лишние проблемы. лишние проблемы ты приобрел положив на форму ADOTable, нужда в переписывании это только последствия, писал бы сразу правильно, не пришлось бы.
-
Так проблема закрылась? Киньте решение...
-
selyanin © (26.06.12 11:16) [7] Помню встречал на 2000 mssql такую ошибку, но ее только выводил дебаггер, exe работал без ошибок.
-
С подобной проблемой встречался. Вместо TADOTable использовались DataSet & Query... Причем ошибка реально появлялась в Дебаг режиме. Экзешник работал нормально.
В том далеком мохнатом году, проблему решили заменив lookup поля на left outer join.. А редактирование в таблице - было запрещено. Собственно в том случае концепция программы позволяла..
Сейчас столкнулся с похоже проблемой в другом проекте.. Стал усердно вспоминать. И на сколько припоминаю, проблема как раз в значениях NULL в тех полях, которые являются lookup. Если исключить такую ситацию, то скорее всего проблемы не станет. Сегодня вечером буду пробовать исключить ситуацию. Решение - отрепортю.
-
В общем на самом деле проблема в NULL значениях. Каким образом обошел? Если делать добавление записи через набор данных, в любом случае будет NULL. Хотя вот сейчас думаю что возможно можно было использовать BeforeInsert?? Мое решение такое:
procedure TfrmBlank.btnAddClick(Sender: TObject);
var
NewID: Integer;
begin
data.qOperation.SQL.Text := 'insert into obj_Blank (dDate, bFotoSession, bVideoSession, lTeacherID, lShoolID, BlankNumber)'+#13;
data.qOperation.SQL.Text := data.qOperation.SQL.Text +
' VALUES('+QuotedStr(FormatDateTime('yyyy-mm-dd hh:MM:ss',Now()))+',0,0,0,0,'+QuotedStr(data.GetDocNum('','obj_Blank'))+')'; data.qOperation.ExecSQL;
data.qOperation.SQL.Text := 'Select max(id) from obj_Blank';
data.qOperation.Open;
if data.qOperation.RecordCount > 0 then
NewID := data.qOperation.Fields[0].AsInteger;
data.qOperation.Close;
data.qBlankList.Requery;
if data.qBlankList.Locate('ID',NewID,[]) then
begin
end
else
ShowMessage('Не удалось создать новую анкету! ');
end;
-
Если поставить CursorType=ctKeyset и LockType=ltOptimistic, то всё должно быть ок.
-
>ixilimuse (27.11.12 20:17) [15] ни параметров, ни понимания, что такое многопользовательская работа
|