Тема: БД в autocad2011

Объясните пожалуйсто почему в 2010 этот код работает хорошо , а в 2011 выходит неунифицированная ошибка на этот код. ( на одной и той же машине)

_variant_t var;
     _ConnectionPtr m_pConnection("ADODB.Connection");;
        _RecordsetPtr m_pRecordset("ADODB.Recordset");; 
        CString strMDBFileName = "c://bd.mdb";

        m_pConnection.CreateInstance(__uuidof(Connection));
        m_pRecordset.CreateInstance(__uuidof(Recordset)); 

        CString m_strConnection;
        try
        {
            m_strConnection.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s"),strMDBFileName);
            m_pConnection->Open((_bstr_t)m_strConnection,_T(""),_T(""),adModeUnknown);//ACAD crash
        }
        catch(_com_error &e)
    CString strError;
            strError.Format(_T("connection open error:%s"),e.ErrorMessage());
            acedAlert (strError);
            return ;
        }
        {

Re: БД в autocad2011

складывается впечатление, что ЭТОТ код вообще не должен наборать.

CString strMDBFileName = "c://bd.mdb";

вот это я бы поменял либо на

CString strMDBFileName = "c:/bd.mdb";

либо на

CString strMDBFileName = "c:\\bd.mdb";

после catch() нет открывающей скобки :)

встречные вопросы:
1. что возвращает Open?
2. правильно ли заданы все параметры в Open?
3. какое отношение ЭТО имеет к ObjectARX?
PS:
для режима Standard security коннект выглядит по-моему так:

strConnect = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\db.mdb;User Id=admin;Password=;");
...Open(strConnect, "MyUsername", "MyPassword");

кстати, :) здесь точно есть ответ на твой вопрос http://yandex.ua/yandsearch?p=1&tex … amp;lr=147

Re: БД в autocad2011

3. К ObjectARX это имеет отношение так как часть arx кода .
Этот код рабочий(насчёт скобок и слешей) .

Объясните пожалуйсто почему в 2010 этот код работает хорошо , а в 2011 выходит неунифицированная ошибка на этот код. ( на одной и той же машине) 

 
На машине где есть студия работает во всех версиях(2010-2011) нормально, а где нет возникает вышеописанная проблема (при этом открываемый файл ни куда не девается). Может в 2011 автокаде нужно какие-то дополнительные настройки системы для обращения к Provider=Microsoft.Jet.OLEDB.4.0

(изменено: Николай, 19 октября 2010г. 14:24:30)

Re: БД в autocad2011

К ObjectARX это имеет отношение так как часть arx кода

этот код может применяться для написания чего угодно под Windows. привязки к автокаду в нем нет и быть не может (acedAlert не считается). ну да ладно.

На машине где есть студия работает во всех версиях(2010-2011) нормально, а где нет возникает вышеописанная проблема

скорей всего, сама arx-ина завязана на какую-то dll, которой нет на другом компьютере, либо сборка arx - Debug.

Может в 2011 автокаде нужно какие-то дополнительные настройки системы для обращения к Provider=Microsoft.Jet.OLEDB.4.0

на сколько я знаю, автокад к этому делу отношения не имеет.
попробуй отцепить этот кусок от arx и собери простой MFC проект. если кусок и там не будет работать, то проблема в настройках самой СУБД. тогда придется сравнивать настройки СУБД рабочего варианта с нерабочим. ну а если будет работать, то проблема в arx-файле. ему не хватает какой-то dll. придется скачать какую-то програмку для просмотра прикрепленных твоей arx-ине dll. ну и по результатам, либо попытаться отцепить эту dll, либо перекинуть ее на другой компьютер и зарегистрировать там.

Re: БД в autocad2011

да, чуть не забыл.
а где ::CoInitialize(NULL) и ::CoUninitialize()
еще проблема может быть в этом.

(изменено: Александр Ривилис, 19 октября 2010г. 15:01:00)

Re: БД в autocad2011

olga wolk
Хотел бы уточнить это один и тот же arx-файл в AutoCAD 2010 работает, а в AutoCAD 2011 не работает или это все-таки два разных arx-файла, скомпилированных с разными версиями ObjectARX SDK?
И хотелось бы увидеть окно с ошибкой.

Николай пишет:

этот код может применяться для написания чего угодно под Windows. привязки к автокаду в нем нет и быть не может (acedAlert не считается). ну да ладно.

Не совсем так. arx-файл - это dll-ка, а в ней то, что работает в отдельном exe-файле может не работать. Я уже с таким сталкивался.

И что-то мне подсказывает, что тут странная смесь ANSI и Unicode.

Re: БД в autocad2011

Не совсем так. arx-файл - это dll-ка, а в ней то, что работает в отдельном exe-файле может не работать. Я уже с таким сталкивался

ну, Александр, у меня таких проблем еще не было. по идее, должно работать везде, если создавать отдельный поток для этой самой работы, хотя может я и не прав. так глубоко я не ковырялся :)

olga wolk, попробуй этот код. собирал без отладки в текстовом редакторе, так что могут быть описки :)

{
       CoInitialize(NULL); // инициализируем поток для COM
       try 
       { 
           CString m_strConnection; 
           CString strMDBFileName = L"c:\\bd.mdb"; // - это должно быть wchar, a не char

            _ConnectionPtr m_pConnection("ADODB.Connection");
            _RecordsetPtr m_pRecordset("ADODB.Recordset"); 
           m_pConnection.CreateInstance( __uuidof(Connection));
           m_pRecordset.CreateInstance(__uuidof(Recordset));

            _bstr_t name(L""); // это должно быть BSTR a не wchar, как у тебя (второй параметр для Open)
            _bstr_t pass(L""); // это должно быть BSTR a не wchar, как у тебя (третий параметр для Open)
            m_strConnection.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s"),strMDBFileName); 
            m_pConnection->Open((_bstr_t)m_strConnection,name,pass,adModeUnknown);
           // ---
           // --- тут работаем с БД
           // ---
            m_pConnection->Close();
        }
        catch(_com_error e)
        {
                strError.Format(_T("DB error: %s"),e.ErrorMessage());
                MessageBox(NULL, strError, L"Error", MB_OK); 
        }

        ::CoUninitialize(); // завершаем работу потока
}

Re: БД в autocad2011

Александр Ривилис,
это один и тотже  arx-файл в AutoCAD 2010 работает, а в AutoCAD 2011 не работает . Скомпилированный в ObjectARX SDK 2010. Сейчас переделываю в ObjectARX SDK 2011 и ставлю однозначно Unicode. О результатах могу сказать только завтра. Так как на моей машине все и так работает.