powered by simpleCommunicator - 2.0.33     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Help me!!! После Execute(CREATE TABLE) Recordset not edit!!!
3 сообщений из 3, страница 1 из 1
Help me!!! После Execute(CREATE TABLE) Recordset not edit!!!
    #32057868
Finder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу решить следующую задачу: создаю таблицу через Execute("CREATE TABLE") и затем пытаюсь занести в нее значений через Recordset. При попытке AddNew() вылетает исключение "Item cannot be found in the collection corresponding to the requested name or ordinal". Чтобы COM-интерфейс мог корректно обновиться, делаю ReConnect - не помогает. ЧТО ДЕЛАТЬ??? Если запустить прогу вторично (заремив создание таблицы) - редактирование идет прекрасно. Можно использовать Execute("INSERT"), НО ОЧЕНЬ НУЖНО ИМЕННО ЧЕРЕЗ _RecordsetPtr.
Работаю с VS & ADO & MSSQL2000. Вот весь пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
::CoInitialize(NULL);
try{
CString ConnStr =  "Provider=SQLOLEDB.1 ;Persist Security Info=False;Initial Catalog=ObjCS;Data Source=FINDER";
CString userid =  "sa" ;   CString paswd =  "mypaswd" ; CString TableName =  "THandleAttr" ;
HRESULT hr;
_variant_t vCn;
_ConnectionPtr Cn;
_RecordsetPtr Rs;
_CommandPtr Cmnd;
// Connect
hr = Cn.CreateInstance(__uuidof(Connection));   if(FAILED(hr)) throw _com_error(hr);
hr = Cn->Open(_bstr_t(ConnStr),_bstr_t(userid),_bstr_t(paswd),adConnectUnspecified);
Cn->CursorLocation = adUseServer;//Cn->CursorLocation = adUseClient;
//
// CREATE TABLE TTmp
hr = Cmnd.CreateInstance(__uuidof(Command));   	if(FAILED(hr)) throw _com_error(hr);
Cmnd->ActiveConnection = Cn;
Cmnd->CommandType = adCmdText;
Cmnd->CommandText = _bstr_t( "CREATE TABLE TTmp (F_ID int NOT NULL DEFAULT 0 )");
Cmnd->Execute(&vtMissing,&vtMissing,adCmdText);
//
// ПОПЫТКА Reconnect
Cmnd = NULL; Cn->Close(); Cn = NULL;
::CoUninitialize();
Sleep( 1000 );
::CoInitialize(NULL);
hr = Cn.CreateInstance(__uuidof(Connection));   if(FAILED(hr)) throw _com_error(hr);
hr = Cn->Open(_bstr_t(ConnStr),_bstr_t(userid),_bstr_t(paswd),adConnectUnspecified);
Cn->CursorLocation = adUseServer;//Cn->CursorLocation = adUseClient;
//
// OPEN NEW TABLE TTmp & AddNew
hr = Rs.CreateInstance(__uuidof(Recordset));	if(FAILED(hr)) throw _com_error(hr);
Rs->CursorLocation = adUseServer; //Rs->CursorLocation = adUseClient; 
Rs->CursorType = adOpenKeyset;
Rs->LockType  = adLockBatchOptimistic;
vCn = Cn.GetInterfacePtr();
hr = Rs->Open(_bstr_t( "TTmp" ),vCn,adOpenKeyset, adLockBatchOptimistic, adCmdTable);
if(FAILED(hr)) throw _com_error(hr);
//
// От AddNew идет исключение: !!!!!!
Rs->AddNew();  // Error: Item cannot be found in the collection corresponding to the requested name or ordinal
//	...SetValue; Rs->UpdateBatch(adAffectCurrent);
Rs->Close();
Cn->Close();
}
catch(_com_error e)
...
::CoUninitialize();	


ГУРУ! ОТЗОВИТЕСЬ! Вопрос-то не шибко мудреный. Должно же это как-то работать????
...
Рейтинг: 0 / 0
Help me!!! После Execute(CREATE TABLE) Recordset not edit!!!
    #32057870
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первичного ключа нет - вот и "неживой" рекордсет.
...
Рейтинг: 0 / 0
Help me!!! После Execute(CREATE TABLE) Recordset not edit!!!
    #32058354
Finder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увы, дело не в этом. Поставил MDAC2.7, теперь ошибка пишется по-русски, но от этого не стала более понятной:
"Не удается найти объект в семействе, соответствующий требуемому имени или порядковому номеру." Попробовал с PRIMARY KEY - не помогает (икслючения на AddNew):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CString ConnStr =  "Provider=SQLOLEDB.1 ;Persist Security Info=False;Initial Catalog=ObjCS;Data Source=FINDER";
CString userid =  "sa" ;   CString paswd =  "empires" ; CString TableName =  "THandleAttr" ;
HRESULT hr;   _variant_t vCn;   _ConnectionPtr Cn;
_RecordsetPtr Rs;   _CommandPtr Cmnd;
// Connect
hr = Cn.CreateInstance(__uuidof(Connection));   if(FAILED(hr)) throw _com_error(hr);
hr = Cn->Open(_bstr_t(ConnStr),_bstr_t(userid),_bstr_t(paswd),adConnectUnspecified);
Cn->Execute(_bstr_t( "CREATE TABLE TTmp (F_ID int IDENTITY (1 , 1 ) NOT NULL PRIMARY KEY CLUSTERED,F_S int NOT NULL DEFAULT  0 )"),&vtMissing,adCmdText);
// OPEN NEW TABLE TTmp & AddNew
hr = Rs.CreateInstance(__uuidof(Recordset));	if(FAILED(hr)) throw _com_error(hr);
Rs->CursorLocation = adUseServer; //Rs->CursorLocation = adUseClient; 
vCn = Cn.GetInterfacePtr();
hr = Rs->Open(_bstr_t( "TTmp" ),vCn,adOpenKeyset, adLockBatchOptimistic, adCmdTable);
if(FAILED(hr)) throw _com_error(hr);
// Exception !!!
Rs->AddNew();  // Error: Item cannot be found in the collection corresponding to the requested name or ordinal
//	...SetValue; Rs->UpdateBatch(adAffectCurrent);
Rs->Close();
Cn->Close();

В чем еще может быть дело? Может, эта трабла именно использования "msado15.dll"?
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Help me!!! После Execute(CREATE TABLE) Recordset not edit!!!
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]