提交 550fd0a1 authored 作者: Thomas Mueller's avatar Thomas Mueller

--no commit message

--no commit message
上级 e5880d3c
/*
* Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
*/
#include <windows.h>
#include <odbcinst.h>
#define NAME "h2odbc"
const char* DRIVER =
NAME "\0"
"Driver=h2odbc.dll" "\0"
"Setup=h2odbc.dll" "\0"
"APILevel=0" "\0"
"ConnectFunctions=YYN" "\0"
"FileUsage=0\0"
"DriverODBCVer=03.00" "\0"
"SQLLevel=0" "\0"
"\0";
bool isInstalled() {
const int max=10240;
char drivers[max];
WORD len;
if(SQLGetInstalledDrivers(drivers,max,&len)==FALSE) {
return false;
}
char* search=drivers;
while(*search) {
if(!strncmp(search, NAME, strlen(NAME))) {
return true;
}
search += strlen(search)+1;
}
return false;
}
bool install(char* path) {
// path=0 means systemdir
DWORD usageCount=0;
char pathout[512];
BOOL result=SQLInstallDriverEx(
DRIVER,
path,
pathout,sizeof(pathout),0,
ODBC_INSTALL_COMPLETE,
&usageCount);
if(result==FALSE) {
DWORD pfErrorCode;
char lpszErrorMsg[512];
SQLInstallerError(1,
&pfErrorCode,
lpszErrorMsg,
sizeof(lpszErrorMsg),
0);
MessageBox(0,lpszErrorMsg,"Error",MB_OK);
}
return result==TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_COMMAND:
case WM_PAINT:
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) {
HWND hWnd;
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = 0; //LoadIcon(hInstance, (LPCTSTR)IDI_H2ODBC_ADMIN);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = 0; // (LPCSTR)IDC_H2ODBC_ADMIN;
wcex.lpszClassName = "h2odbc_setup";
wcex.hIconSm = 0; //LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
RegisterClassEx(&wcex);
hWnd = CreateWindow("h2odbc_setup", "H2ODBC", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if(!hWnd) {
return FALSE;
}
int result;
if(!isInstalled()) {
result=MessageBox(0,
"The driver is not yet installed.\n"
"Install the driver now? If you like to install, \n"
"you will need to locate the driver dll.",
"ODBC Installation",MB_OKCANCEL);
if(result!=IDOK) {
MessageBox(0,
"Installation canceled.",
"ODBC Installation",MB_OK);
return 0;
}
char directory[512];
directory[0]=0;
OPENFILENAME file;
file.lStructSize=sizeof(file);
file.hwndOwner=hWnd;
file.hInstance=0;
file.lpstrFilter="H2ODBC Driver (h2odbc.dll)" "\0" "h2odbc.dll" "\0" "\0";
file.lpstrCustomFilter=0;
file.nMaxCustFilter=0;
file.nFilterIndex=0;
file.lpstrFile=directory;
file.nMaxFile=sizeof(directory);
file.lpstrFileTitle=0;
file.nMaxFileTitle=0;
file.lpstrInitialDir=0;
file.lpstrTitle="ODBC Installation";
file.Flags=OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
file.nFileOffset=0;
file.nFileExtension=0;
file.lpstrDefExt=0;
file.lCustData=0;
file.lpfnHook=0;
file.lpTemplateName=0;
result=GetOpenFileName(&file);
if(result==FALSE) {
MessageBox(0,
"Installation canceled.",
"ODBC Installation",MB_OK);
return 0;
} else {
directory[file.nFileOffset]=0;
if(!install(directory)) {
MessageBox(0,
"There was an error while installing.",
"ODBC Installation",MB_OK);
return 0;
}
}
MessageBox(0,
"Installation completed successfully.\n"
"You can now add a new datasource to your ODBC configuration.\n"
"The ODBC Data Source Administator dialog will appear now,\n"
"and whenever you start this application again.",
"ODBC Installation",MB_OK);
}
SQLManageDataSources(hWnd);
return 0;
}
/*
* Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
*/
#include <cstdlib>
#include <iostream>
#include <winsock.h>
#include <windows.h>
#include <odbcinst.h>
#include <sqlext.h>
using namespace std;
void test();
int main(int argc, char *argv[]) {
test();
system("PAUSE");
return EXIT_SUCCESS;
}
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLRETURN retcode;
#define NAME_LEN 20
void showError() {
SQLCHAR sqlState[6], msg[100];
SQLINTEGER nativeError;
SQLSMALLINT i, msgLen;
SQLRETURN retcode = SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, 1, sqlState, &nativeError, msg, sizeof(msg), &msgLen);
if(retcode == SQL_NO_DATA) {
printf("Error: no data\n");
} else {
printf("Error: state=%s msg=%s native=%d\n", sqlState, msg, nativeError);
}
}
void testBindParameter() {
/* Prepare the SQL statement with parameter markers. */
retcode = SQLPrepare(hstmt,
(SQLCHAR*)"INSERT INTO TEST(ID, NAME) VALUES (?, ?)", SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Specify data types and buffers for OrderID, CustID, OpenDate, SalesPerson, */
/* Status parameter data. */
SQLINTEGER id;
SQLCHAR name[NAME_LEN];
SQLINTEGER cbId = 0, cbName = SQL_NTS;
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT,
SQL_INTEGER, 0, 0, &id, 0, &cbId);
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR,
SQL_CHAR, NAME_LEN, 0, name, 0, &cbName);
/* Specify first row of parameter data. */
id = 1002;
strcpy((char*)name, "Galaxy2");
/* Execute statement with first row. */
retcode = SQLExecute(hstmt);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
printf("inserted\n");
} else {
showError();
}
} else {
showError();
}
}
void testTables() {
SQLCHAR name[100];
SQLCHAR remark[100];
SQLINTEGER cbName = SQL_NTS, cbRemark = SQL_NTS;
printf("catalogs\n");
retcode = SQLTables(hstmt, (SQLCHAR*)SQL_ALL_CATALOGS, SQL_NTS, (SQLCHAR*)"", SQL_NTS, (SQLCHAR*)"", SQL_NTS, (SQLCHAR*)"", SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLBindCol(hstmt, 1, SQL_C_CHAR, name, sizeof(name), &cbName);
SQLBindCol(hstmt, 5, SQL_C_CHAR, remark, sizeof(remark), &cbRemark);
while (TRUE) {
retcode = SQLFetch(hstmt);
if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
showError();
} else if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
printf("catalog: %s remark: %s\n", name, remark);
} else {
break;
}
}
} else {
showError();
}
printf("schemas\n");
retcode = SQLTables(hstmt, (SQLCHAR*)"", SQL_NTS, (SQLCHAR*)SQL_ALL_SCHEMAS, SQL_NTS, (SQLCHAR*)"", SQL_NTS, (SQLCHAR*)"", SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLBindCol(hstmt, 2, SQL_C_CHAR, name, sizeof(name), &cbName);
SQLBindCol(hstmt, 5, SQL_C_CHAR, remark, sizeof(remark), &cbRemark);
while (TRUE) {
retcode = SQLFetch(hstmt);
if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
showError();
} else if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
printf("schema: %s remark: %s\n", name, remark);
} else {
break;
}
}
} else {
showError();
}
printf("tableTypes\n");
retcode = SQLTables(hstmt, (SQLCHAR*)"", SQL_NTS, (SQLCHAR*)"", SQL_NTS, (SQLCHAR*)"", SQL_NTS, (SQLCHAR*)SQL_ALL_TABLE_TYPES, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLBindCol(hstmt, 4, SQL_C_CHAR, name, sizeof(name), &cbName);
SQLBindCol(hstmt, 5, SQL_C_CHAR, remark, sizeof(remark), &cbRemark);
while (TRUE) {
retcode = SQLFetch(hstmt);
if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
showError();
} else if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
printf("tableType: %s remark: %s\n", name, remark);
} else {
break;
}
}
} else {
showError();
}
printf("tables\n");
retcode = SQLTables(hstmt, (SQLCHAR*)"%", SQL_NTS, (SQLCHAR*)"%", SQL_NTS, (SQLCHAR*)"%", SQL_NTS, (SQLCHAR*)"%", SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLBindCol(hstmt, 3, SQL_C_CHAR, name, sizeof(name), &cbName);
SQLBindCol(hstmt, 5, SQL_C_CHAR, remark, sizeof(remark), &cbRemark);
while (TRUE) {
retcode = SQLFetch(hstmt);
if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
showError();
} else if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
printf("table: %s remark: %s\n", name, remark);
} else {
break;
}
}
} else {
showError();
}
printf("done\n");
}
void testBindCol() {
SQLINTEGER id;
SQLCHAR name[NAME_LEN];
SQLINTEGER cbId, cbName;
SQLRETURN retcode = SQLExecDirect(hstmt, (SQLCHAR*)"SELECT ID, NAME FROM TEST", SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Bind columns 1, 2 */
SQLBindCol(hstmt, 1, SQL_C_ULONG, &id, 0, &cbId);
SQLBindCol(hstmt, 2, SQL_C_CHAR, name, NAME_LEN, &cbName);
/* Fetch and print each row of data. On */
/* an error, display a message and exit. */
while (TRUE) {
retcode = SQLFetch(hstmt);
if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
showError();
} else if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
printf("id=%-5d %-*s\n", id, NAME_LEN-1, name);
} else {
break;
}
}
} else {
showError();
}
}
void test() {
/*Allocate environment handle */
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Set the ODBC version environment attribute */
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Allocate connection handle */
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Set login timeout to 5 seconds. */
SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (void*)5, 0);
/* Connect to data source */
retcode = SQLConnect(hdbc, (SQLCHAR*) "Test", SQL_NTS,
(SQLCHAR*) "sa", SQL_NTS,
(SQLCHAR*) "", SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
/* Allocate statement handle */
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Process data */
//testBindCol();
//testBindParameter();
testTables();
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
SQLDisconnect(hdbc);
}
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
}
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
}
/*
* Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
*/
#include <windows.h>
#include <odbcinst.h>
#define NAME "h2odbc"
bool isInstalled() {
const int max=10240;
char drivers[max];
WORD len;
if(SQLGetInstalledDrivers(drivers,max,&len)==FALSE) {
return false;
}
char* search=drivers;
while(*search) {
if(!strncmp(search, NAME, strlen(NAME))) {
return true;
}
search += strlen(search)+1;
}
return false;
}
bool uninstall() {
BOOL removeDataSources=FALSE;
BOOL removeAll=FALSE;
DWORD usageCount;
BOOL successfull;
bool result=false;
do {
successfull=SQLRemoveDriver(NAME, removeDataSources, &usageCount);
if(successfull==TRUE) {
result=true;
}
} while(removeAll==TRUE && usageCount>0);
return result;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
if(!isInstalled()) {
MessageBox(0,
"The ODBC driver is not installed.\n"
"There is nothing to un-install.",
"Uninstall",MB_OK);
} else {
int result=MessageBox(0,
"Un-Install the ODBC driver now?",
"Uninstall",MB_YESNO);
if(result==IDYES) {
if(uninstall()) {
MessageBox(0,
"The driver has been uninstalled successfully.",
"Uninstall",MB_OK);
} else {
MessageBox(0,
"There was an error while un-installing.",
"Uninstall",MB_OK);
}
} else {
MessageBox(0,
"The driver remains installed.",
"Uninstall",MB_OK);
}
}
return 0;
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论