Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Перевести Delphi на C++Builder


Автор: Alca 13.1.2009, 10:51
C++Builder 2009.
Есть код на Делфи:
Код

{Создать базы данных Access} 
//Using ADOX: 
uses
   ComObj;
 // You can with ADOX (Microsoft ADO Extensions for DDL and Security), 
function CreateAccessDatabase(FileName: string): string;
 var
    cat: OLEVariant;
 begin
   Result := '';
   try
     cat := CreateOleObject('ADOX.Catalog');
     cat.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + FileName + ';');
     cat := NULL;
   except
     on e: Exception do Result := e.message;
   end;
 end;

 procedure TForm1.Button1Click(Sender: TObject);
 begin
   CreateAccessDatabase('c:\Testdb.mdb');
 end;

Собственно интересует вот эта часть:
Код

#include <ComObj.hpp>
//...
OleVariant cat;
cat = CreateOleObject("ADOX.Catalog");
cat.Create(L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\new.mdb;");
cat = NULL;

Получаю:
Код

[BCC32 Error] CAccess.cpp(97): E2316 'Create' is not a member of 'OleVariant'

Чего не так?

Автор: MuForum 13.1.2009, 22:17
#1, Alca - Я в этом не спец, но очевидно, что метода 'Create' в этом классе нету. (В Help'е билдера можно просмотреть все методы)
- Как решить проблему, к сожалению не не знаю =(
- Никогда с этим не работал.

# Добавлено: Может в новой версии компилятора необходимо использовать другой метод, например 'OlePropertySet()'.
- Это предположение.

Автор: mrbrooks 13.1.2009, 23:20
Как я понимаю деляфиный код создает аксессовскую бд.
Я лично создаю сам файл в 2009 так:
Код

Variant var;
var = CreateOleObject("Access.Application");
var.OleProcedure("NewCurrentDatabase", "C:\\888.mdb");
var.OleProcedure("Quit");
var = Unassigned;


Автор: Alca 13.1.2009, 23:21
Гы. А если Эксес не установлен?

Автор: mrbrooks 13.1.2009, 23:22
А уже в ADOConnection->ConnectionString формирую строку "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+"C:\\888.mdb"
и т.д.

Добавлено через 2 минуты и 39 секунд
Цитата(Alca @  13.1.2009,  23:21 Найти цитируемый пост)
Гы. А если Эксес не установлен? 

с сим не сталкивался. если не стоит - это не катит.

Автор: Alca 13.1.2009, 23:38
Нужно создать mdb-шник через ADO в С++Builder 2009

Автор: Данкинг 14.1.2009, 00:26
Цитата(Alca @  13.1.2009,  23:21 Найти цитируемый пост)
Гы. А если Эксес не установлен? 

Я так понимаю, если оный не установлен, то строка "Microsoft.Jet.OLEDB.4.0" определённо не прокатит, поскольку такого драйвера в системе нет. А этот пример на Дельфи (из DRKB, как я понимаю) я неоднократно юзал, работает отлично (разумеется, при установленном Access).

Автор: Alca 14.1.2009, 00:38
Цитата

определённо не прокатит

Данкинг, ты не прав.

Автор: Данкинг 14.1.2009, 00:43
Цитата(Alca @  14.1.2009,  00:38 Найти цитируемый пост)
Данкинг, ты не прав. 

Почему? А откуда возьмётся драйвер "Microsoft.Jet" ?

Автор: Alca 14.1.2009, 00:52
ADO с виндой идет.

Автор: Данкинг 14.1.2009, 00:56
Ну а почему же тогда через ADO нельзя подключиться к базе FoxPro, если на данном компе фокс не установлен? smile 

Автор: Alca 14.1.2009, 00:58
А почему можно создать мдб-шник без эксеса?
MSSQL Server тоже не будет через ADO работать без эксеса?

Автор: Данкинг 14.1.2009, 01:05
Цитата(Alca @  14.1.2009,  00:58 Найти цитируемый пост)
А почему можно создать мдб-шник без эксеса?

Как именно создать - этим вот кодом? smile 

Цитата(Alca @  14.1.2009,  00:58 Найти цитируемый пост)
MSSQL Server тоже не будет через ADO работать без эксеса?

Без драйвера SQL-сервера не будет.

Автор: Alca 14.1.2009, 01:07
 smile 

Автор: Romikgy 14.1.2009, 01:11
Код

Variant cat;

cat = CreateOleObject("ADOX.Catalog");
cat.OleProcedure("create","Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\new.mdb;");
cat = NULL;

Автор: mrbrooks 14.1.2009, 08:44
Romikgy, я так делал - но у меня Борман генерирует ошибку

Цитата

[BCC32 Fatal Error] u_temp.cpp(40): F1004 Internal compiler error at 0x4c2471b with base 0x4bc0000


хотя возможно есть смысл поковыряться в настройках компилятора.

Добавлено через 24 секунды
Говорю о C++ Builder 2009

Автор: Romikgy 14.1.2009, 10:16
Цитата(mrbrooks @  14.1.2009,  07:44 Найти цитируемый пост)
Говорю о C++ Builder 2009 

я в нем и проверял , ошибок при компиляции не было одна разница с твоим кодом !!!!!
Цитата(Romikgy @  14.1.2009,  00:11 Найти цитируемый пост)
Variant cat;

так работает а так 
Цитата(Alca @  13.1.2009,  09:51 Найти цитируемый пост)
OleVariant cat;

нет !

незнаю в чем у них отличие , но с олевариант не работает, там другой прототип , но с ним я не разобрался((

Автор: Alca 14.1.2009, 10:20
Цитата

Код

Variant cat;

cat = CreateOleObject("ADOX.Catalog");
cat.OleProcedure("create","Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\new.mdb;");
cat = NULL;


Не создаётся!  smile 
Я в шоке. Нет слов.

Автор: mrbrooks 14.1.2009, 10:22
Romikgy, Разобрался. Все работает  smile 


Alca, у меня все ок.

Автор: Alca 14.1.2009, 10:25
Засвети код.

Автор: mrbrooks 14.1.2009, 10:27
Код

        Variant vADO;
    vADO = CreateOleObject("ADOX.Catalog");
    vADO.OleProcedure("Create","Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\123.mdb;");
    vADO = NULL;

Автор: Alca 14.1.2009, 10:41
Заработало. Я так понял, что второй аргумент в функции OleProcedure это не юникодная строка.
Чего так?

Автор: Romikgy 14.1.2009, 10:46
да и первый не юникод имхо 
по мануалам на дельфи 
variant это ansistring 
olevariant это widestring
в чем разница в реализаций трудный вопрос поидее должно было быть наследование но инфы на этот счет не нашел((

Автор: Alca 14.1.2009, 10:56
Второй аргумент это WideString. Ну и где же поддержка юникода?

Автор: mrbrooks 14.1.2009, 10:58
Интересно. Сам Variant действительно поддерживает только AnsiString, а вот аргументы в методе OleProcedure Unicode поддерживают. Но компиллер именно на аргументы в юникоде и матерится. Это возмутительно - либо есть какой то нюанс.

Автор: Alca 14.1.2009, 11:16
Инересно было бы докопаться до истины. smile 
В самом методе путь к файлу это WideString строка, 
а передается в метод UnicodeString строка и 
всё работает как надо, файл создаётся.
Я так понял что Unicode при вызове функции плавно
перешел в WideString......
Код

//---------------------------------------------------------------------------
bool bCreateAdoMDB(const WideString &cwsMdbFilePath) {
    bool    bRes = false;
    Variant vADO = Unassigned;

    try {
        vADO = CreateOleObject(L"ADOX.Catalog");
        vADO.OleProcedure(L"Create", WideString("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=") + cwsMdbFilePath + WideString(";"));

        bRes = true;
    } catch (...) {
        bRes = false;
    }

    vADO = Unassigned;

    return bRes;
}
//---------------------------------------------------------------------------
UnicodeString usMdbFilePath = L"C:\\xxxxxxx.mdb";
if (false == bCreateAdoMDB(usMdbFilePath)) {
    MessageBox(0, L"false == bCreateAdoMDB", L"", MB_OK);
}
//---------------------------------------------------------------------------


Добавлено @ 11:29
Надо Unicode в WideString переганять.
Код

bool bCreateAdoMDB(const UnicodeString &cusMdbFilePath) {
    bool    bRes = false;
    Variant vADO = Unassigned;

    try {
        vADO = CreateOleObject(L"ADOX.Catalog");
        vADO.OleProcedure(L"Create", WideString(L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=") + WideString(cusMdbFilePath) + WideString(L";"));
        bRes = true;
    } catch (...) {
        bRes = false;
    }

    vADO = Unassigned;

    return bRes;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)