2012-11-30 75 views
0

這是我的代碼示例是火鳥安裝目錄(C:\ Program Files文件\火鳥\ Firebird_2_5 \實例):部分靈感源代碼示例創建數據庫使用火鳥API失敗

AnsiString db_path = MainForm->exeFilePath + "\\results.fdb"; // C:\Projects\DBX\bin\results.fdb 
if (FileExists(db_path)) 
{ 
    return; 
} 

HMODULE dll = LoadLibrary(L"fbclient.dll"); 
if (dll == NULL) 
{ 
    throw Exception(L"Failed to load Firebird client library FBCLIENT.DLL!\r\nApplication will exit now."); 
} 

Pisc_dsql_execute_immediate pisc_dsql_execute_immediate = (Pisc_dsql_execute_immediate)GetProcAddress(dll, "isc_dsql_execute_immediate"); 
if (pisc_dsql_execute_immediate == NULL) 
{ 
    throw Exception(L"Failed to load 'isc_dsql_execute_immediate' entry point in FBCLIENT.DLL. It seems like Firebird installation is corrupted. " 
    "Contact system administrator.\r\nApplication will exit now."); 
} 

Pisc_commit_transaction pisc_commit_transaction = (Pisc_commit_transaction)GetProcAddress(dll, "isc_commit_transaction"); 
if (pisc_commit_transaction == NULL) 
{ 
    throw Exception(L"Failed to load 'isc_commit_transaction' entry point in FBCLIENT.DLL. It seems like Firebird installation is corrupted. " 
    "Contact system administrator.\r\nApplication will exit now."); 
} 

Pisc_detach_database pisc_detach_database = (Pisc_detach_database)GetProcAddress(dll, "isc_detach_database"); 
if (pisc_detach_database == NULL) 
{ 
    throw Exception(L"Failed to load 'isc_detach_database' entry point in FBCLIENT.DLL. It seems like Firebird installation is corrupted. " 
    "Contact system administrator.\r\nApplication will exit now."); 
} 

Pisc_sqlcode pisc_sqlcode = (Pisc_sqlcode)GetProcAddress(dll, "isc_sqlcode"); 
if (pisc_sqlcode == NULL) 
{ 
    throw Exception(L"Failed to load 'isc_sqlcode' entry point in FBCLIENT.DLL. It seems like Firebird installation is corrupted. " 
    "Contact system administrator.\r\nApplication will exit now."); 
} 

ISC_STATUS_ARRAY status;    /* status vector */ 
isc_db_handle newdb = NULL;   /* database handle */ 
isc_tr_handle trans = NULL;   /* transaction handle */ 
AnsiString create_db; 
create_db.printf("CREATE DATABASE '%s'", db_path.c_str()); 
long sqlcode; 
UnicodeString msg; 

if (pisc_dsql_execute_immediate(status, &newdb, &trans, 0, create_db.c_str(), 1, NULL)) 
{ 
    // ERROR OCCURRES HERE 
    sqlcode = pisc_sqlcode(status); 
    msg.printf(L"Operation 'CREATE DATABASE' failed with sqlcode %ld.\r\nApplication will exit now.", sqlcode); 
    throw Exception(msg.c_str()); 
} 

pisc_commit_transaction(status, &trans); 
pisc_detach_database(status, &newdb); 

FreeLibrary(dll); 
dll = NULL; 

數據庫創建與SQL代碼-902失敗。目錄'C:\ Projects \ DBX \ bin \'存在,並且不包含名爲'results.fdb'的文件。錯誤行爲的原因是什麼,我該如何避免它?是否有Firebird API的詳細說明?

+0

我認爲,如果你直接調用isc_create_database,因爲我不知道,如果通過execute_immediate支持CREATE DATABASE語句就可以成功。 – jachguate

+0

@jachguate立即執行會工作,但您需要首先連接到服務器;我相信這也適用於isc_create_database。順便說一句:sqlcode -902並不是真的有用(因爲它涵蓋了大量的錯誤),所以最好是得到gds錯誤代碼 –

+0

@Mark你可能是對的,隨意發佈它作爲答案,但這看起來像一個被遺棄的問題,因爲OP從未回來提供反饋。 – jachguate

回答

0

我忘記了用戶憑證。請參閱更新的代碼示例(節選):

ISC_STATUS_ARRAY status;    /* status vector */ 
isc_db_handle newdb = NULL;   /* database handle */ 
isc_tr_handle trans = NULL;   /* transaction handle */ 
AnsiString create_db; 
create_db.printf("CREATE DATABASE '%s' USER '%S' PASSWORD '%S'", db_path.c_str(), MainForm->currentUser.name, MainForm->currentUser.password); 
long sqlcode; 
UnicodeString msg; 

if (pisc_dsql_execute_immediate(status, &newdb, &trans, 0, create_db.c_str(), 1, NULL)) 
{ 
    sqlcode = pisc_sqlcode(status); 
    msg.printf(L"Operation 'CREATE DATABASE' failed with sqlcode %ld.\r\nApplication will exit now.", sqlcode); 
    throw Exception(msg.c_str()); 
}