← →
Dgs
(2003-02-18 18:33)
[0]
Ситуация следующая:
сервер Oracle 9i (под Windows)
клиент Oracle 7.3.4 (Настройки BDE: DLL32 — SQLORA32.DLL, VENDOR INIT — ORA73.DLL)
var
Table1: TTable;
begin
Table1.DataBase.StartTransaction;
Table1.Edit;
Table1.FieldByName(«Field1»).AsFloat := 123.55;
Table1.Post; // На данном методе выдает сообщение об ошибке
// «Capability not supported»
Table1.DataBase.Commit;
end;
Причем данная ошибка возникает
только при стартованной транзакции.
Возможно кто-то уже сталкивался с этой ошибкой и знает пути ее решения.
PS: c клиентом Oracle 9 (Настройки BDE: DLL32 — SQLORA8.DLL, VENDOR INIT — OCI.DLL) таже история.
← →
Pat
(2003-02-18 21:49)
[1]
> Table1.DataBase.StartTransaction
ИМХО надо коннектится через компонент TDataBase и у него стартовать транзакцию
ИМХО №2 транзакция уже активна. Проверяй Database.InTransaction, завершай и стартуй новую
← →
Dgs
(2003-02-19 11:00)
[2]
Чтобы избежать неоднозначности, сразу оговорюсь:
компоненты TTable(TQuery) в любом случае содержат указатель на DataBase (TDataBase), даже если явно не использовать TDataBase в своем приложении, этот компонент будет создан автоматом Delphi.
В отрывке кода, который я привел не содержится проверки Database.InTransaction, это сделано специально, чтобы не «засорять» данный фрагмент кода.
Ошибка возникает на вызове метода Post при стартованной транзакции. Если бы проблема была в попытке стартануть уже активную транзакцию — ошибка была бы на вызове Table1.DataBase.StartTransaction.
И еще один важный момент, в следуейщей связке:
сервер Oracle 7.3.4 (под Windows)
клиент Oracle 7.3.4 (Настройки BDE: DLL32 — SQLORA32.DLL, VENDOR INIT — ORA73.DLL)
все работает нормально (ошибка не возникает)
← →
Reindeer Moss Eater
(2003-02-19 11:03)
[3]
Проверяй Database.InTransaction
Клиент может не знать что транзакция уже стартована сервером.
← →
Desdechado
(2003-02-19 11:38)
[4]
По существу — неявная транзакция в твоем коде абсолютно равнозначна явной (по логике).
Небольшой оффтопик:
>сервер Oracle 9i
>клиент Oracle 7.3.4
несколько странноватое подключение
А клиентом DB2 не пробовал подключаться?
И еще: Oracle и TTable — очень неудачное сочетание. На траффик не смотрел? А на набор запросов, которые при этом использует БДЕ?
← →
Reindeer Moss Eater
(2003-02-19 11:41)
[5]
В любом случаее Capability not supported указывает на вложенные транзакции, которые не поддерживаются твоим сервером.
← →
Dgs
(2003-02-19 13:19)
[6]
> В любом случаее Capability not supported указывает на вложенные > транзакции, которые не поддерживаются твоим сервером.
Это не так по одной простой причине — в Oracle нет вложенных транзакций. Плюс ко всему на связке Oracle 7.3.4(server)-Oracle 7.3.4(client) ошибка не возникает.
← →
gek
(2003-02-19 13:26)
[7]
попробуй установить DataBase.TransIsolation:=tiDirtyRead;
и
if DataBase.inTransaction then
> И еще: Oracle и TTable — очень неудачное сочетание.
Согласен
← →
Reindeer Moss Eater
(2003-02-19 14:19)
[8]
Dgs ©
Это не так по одной простой причине — в Oracle нет вложенных транзакций
Это не так, потому что в Oracle есть вложенные транзакции, но твой сервер их не поддерживает
← →
Dgs
(2003-02-19 16:01)
[9]
Reindeer Moss Eater:
в Oracle есть вложенные транзакции, но твой сервер их не поддерживает
Если не секрет, что понимается под вложенными транзакциями?
Исходные условия следующие: Oracle 9.2.0.1 под Windows.
Насколько я знаю помимо обычных транзакций, не поддерживающие вложенность(SAVEPOINT — это не вложенные транзакции и BDE их не поддерживает) существуют AUTONOMOUS_TRANSACTION, но это тоже не вложенные транзакции.
И еще. Я
прекрасно понимаю, что Oracle и TTable — очень неудачное сочетание. Более того оно идет вразрез с концепциями клиент-серверных приложений. Но существует такая проблема(которую я описал выше) и меня интересуют пути ее решения, а не мнения по поводу используемых компонент.
← →
Reindeer Moss Eater
(2003-02-19 16:06)
[10]
Dgs ©
1.Любой поисковик + «orcale nested transaction» или прямо к Ларри.
2. Ты ничего не рассказал про значение параметров DBE SQLPATHTRU MODE для случаев когда работает и когда не работает.
← →
Dgs
(2003-02-19 17:23)
[11]
Единственное что удалось найти по поводу nested transaction для Oracle — это описание все тех же AUTONOMOUS_TRANSACTION, про которые я уже упоминал. Более того, в документации сказано, что AUTONOMOUS_TRANSACTION
НЕ являются вложенными.
————————
Autonomous Versus Nested Transactions
Although an autonomous transaction is started by another transaction, it is not a nested transaction for the following reasons:
1. It does not share transactional resources (such as locks) with the main transaction.
2. It does not depend on the main transaction. For example, if the main transaction rolls back, nested transactions roll back, but autonomous transactions do not.
3. Its committed changes are visible to other transactions immediately. (A nested transaction’s committed changes are not visible to other transactions until the main transaction commits.)
4. Exceptions raised in an autonomous transaction cause a transaction-level rollback, not a statement-level rollback.
————————
Что касается SQLPATHTRU MODE, этот параметр установлен в SHARED AUTOCOMMIT (пробовались и другие варианты, результат тотже)
Если есть желание и время дальнейшее обсуждение можно продолжить по ICQ: 136395177 или в чате
← →
Reindeer Moss Eater
(2003-02-19 17:33)
[12]
Для самостоятельно (явного) управления транзакциями нужно использовать значение NOT SHARED.
Хотя не уверен, что это поможет
← →
Suntechnic
(2003-02-20 07:03)
[13]
>Dgs ©
Глянь сюда:
http://community.borland.com/article/0,1410,25183,00.html
>All
И ещё. Не надо путать явные/неявные транзакции с режимом autocommit. Понятия хоть и в чём то пересекаются, но всё-таки разные. В Oracle нельзя явно стартовать транзакцию. Они по умолчанию все стартуются неявно.
← →
Sergey13
(2003-02-20 10:21)
[14]
2Dgs © (18.02.03 18:33)
>Ситуация следующая:
сервер Oracle 9i (под Windows)
клиент Oracle 7.3.4 (Настройки BDE: DLL32 — SQLORA32.DLL, VENDOR INIT — ORA73.DLL)
Шаманство конечно, но если попробовать поставить на сервер с 9 параметр совместимости на твою 7(если встанет). Может попрет. Хотя какой тогда смысл юзать 9
← →
Dgs
(2003-02-20 10:30)
[15]
>Suntechnic ©
>
http://community.borland.com/article/0,1410,25183,00.html
читал я эту статью, как и впрочем некоторые другие на эту тему, результат — все таже ошибка. Да и к тому же, это немного не то. В этой статье идет речь про парсинг SQL, а мы имеем дело с таблицей.
Мне кажется здесь дело исключительно в BDE. Либо данную конфигурацию оно пока не поддерживает, либо нужно прописать в настройках BDE какую-то хитрую DLL, либо добавить\заменить уже существующие.
здравствуйте! пишу в делфи 7 телефонный справочник.
использую: Table, DBGrid, DataSource, Query.
в Database Desktop создал базу данных Paradox 7 из 3-ёх ячеек:
телефон — имя — адрес
пример записи:
2-10-15 Пупкин Ул.Каштановая 51
делаю поиск по телефону: разместил Edit, событие по изменению содержимого.
смысл сделать так, чтобы при вводе в него 21015 находило запись выше^
Delphi | ||
|
но как только начинаю вводить числа, выскакивает ошибка
capability not supported
помогите, пожалуйста.
Форум программистов Vingrad
Модераторы: Poseidon, Snowy, bems, MetalFan |
Поиск: |
|
Опции темы |
|
Правила форума «Delphi: Общие вопросы» | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
Problem Description
I am using Delphi to access the QODBC driver. Simple test program. Have a query, data source, and grid on a form. Database Name in the Query properties is set to QuickBooks Data. Some things work fine; some do not. For example… ‘Select * from Transaction’ works just fine, but ‘select * from Account’ returns the error:
‘Capability not supported. [QODBC] Driver not capable.’
But when I run the QODBC Support Wizard and put the same SQL statement in, it returns data just fine. I installed QB, then the QODBC drivers then I had to repair QB.
Below is some error information from the qodbctra.txt file:
ISAMGetData
0x005A3268 [ISAM]
0x09141968 [Account]
COLUMN: 7 (Pass Through)
OFFSET: 0 RawXML: FALSE
ForceUnoptimized: FALSE
DoNotMoveToCache: FALSE
UpdateOptimized: FALSE
SQL_C_SHORT
-13108
MAX LENGTH: 2
LENGTH RETURNED: 2
ERR_NOTCAPABLE S1C00 IM001 [QODBC] Driver not capable
ISAMGetErrorMessage
0x005A3268 [ISAM]
S1C00 IM001 [QODBC] Driver not capable
ISAMCloseTable
0x005A3268 [ISAM]
0x09141968 [Account]
NO_ISAM_ERR 00000 00000
After further checking, the VENDOR table has columns that are Boolean/Bit/YesNo fields (IsActive), and ‘select * from Vendor’ gives the same results.
Solution
The issue is that the driver is having problems with the data type SQL_C_SHORT. I am not sure why Delphi wants Booleans returned as SQL_C_SHORT. Considering how many copies of QODBC are out there, this does not come up. Try the query below:
SELECT ListID, {fn CONVERT(«IsActive», SQL_INTEGER)} AS «IsActive» FROM Customer
The select statement did work, and Delphi does want the Booleans as SQL_C_SHORT. The problem was with the BDE.
Note: If testing with a simple BDE TQuery with the database name set to ‘QUICKBOOKS DATA,.’ Along with the error above, you could always get a pop-up for the login info. So an option is to switch to using an ADOConnection and an ADOQuery with the connection string set to:
Provider=MSDASQL.1;Persist Security Info=False;Data Source=QuickBooks Data;
That could get rid of the pop-up, AND it handles the Boolean issue just fine.
Всем добрый день, бьюсь почти неделю не могу понять в чем дело в приведенном куске кода (см. ниже) TDBThread = class(TThread); FDB: TDatabase; возникает ошибка Capability not supported, но возникает странно раз в два дня, раз в день. Приложение работает круглосуточно. Не подскажите куда копать и что делать
Заранее всем благодарен.
destructor TDBThread.Destroy;
begin
if Assigned(FDB) then
begin
if FDB.Connected then FDB.Close;
FreeAndNil(FDB)
end;
inherited Destroy;
end;
Здравствуйте, SdrCoder, Вы писали:
Копать — во-первых, точно отловить, где возникает это исключение. Первое что стоит сделать — поиск процитированной строки по исходникам VCL. Если не поможет — посадить свой обработчик на RaiseErrorProc, и фиксировать стек вызовов.
Кроме того, стоит отметить, что всю эту конструкцию почти наверняка отлично заменит единственный FreeAndNil(FDB).
И наконец — уничтожение компонента соединения в потоке есть несколько сомнительная операция. Довольно велика вероятность того, что ее стоит заменить на использование пула соединений, в котором использованный объект просто возвращается в список свободных; часто это значительно экономит ресурсы.