Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Help me!!! После Execute(CREATE TABLE) Recordset not edit!!! / 3 сообщений из 3, страница 1 из 1
14.10.2002, 11:33
    #32057868
Finder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help me!!! После Execute(CREATE TABLE) Recordset not edit!!!
Не могу решить следующую задачу: создаю таблицу через 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
14.10.2002, 11:45
    #32057870
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help me!!! После Execute(CREATE TABLE) Recordset not edit!!!
Первичного ключа нет - вот и "неживой" рекордсет.
...
Рейтинг: 0 / 0
15.10.2002, 13:23
    #32058354
Finder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help me!!! После Execute(CREATE TABLE) Recordset not edit!!!
Увы, дело не в этом. Поставил 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
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Help me!!! После Execute(CREATE TABLE) Recordset not edit!!! / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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