64,691
社区成员
发帖
与我相关
我的任务
分享
#ifndef _ADO_SQL_H_
#define _ADO_SQL_H_
#ifndef ADO_API
#ifdef __cplusplus
#define ADO_API extern "C" __declspec(dllimport)
#else
#define ADO_API __declspec(dllimport)
#endif
#else
#undef ADO_API
#ifdef __cplusplus
#define ADO_API extern "C" __declspec(dllexport)
#else
#define ADO_API __declspec(dllexport)
#endif
#endif
#ifndef STDCALL
#define STDCALL __stdcall
#endif
#ifndef Bool
#define Bool int
#endif
#ifndef True
#define True 1
#endif
#ifndef False
#define False 0
#endif
struct ADOConn;
#define ADO_FIELD_NAME_LEN 64
#define ADO_FIELD_VALUE_LEN (8 * 1024)
struct ADOFieldInfo
{
char name[ADO_FIELD_NAME_LEN];
char value[ADO_FIELD_VALUE_LEN];
};
typedef void (STDCALL* ADOQueryCallback)(const struct ADOFieldInfo* info, int fieldCount, void* user);
ADO_API Bool STDCALL ADO_Initialize();
ADO_API void STDCALL ADO_Uninitialize();
ADO_API struct ADOConn* STDCALL ADO_CreateConnection(const char* connString);
ADO_API void STDCALL ADO_DestroyConnection(struct ADOConn* conn);
ADO_API Bool STDCALL ADO_Exec(struct ADOConn* conn, const char* sql);
ADO_API void STDCALL ADO_Query(struct ADOConn* conn, const char* sql, ADOQueryCallback cb, void* user);
#endif
// ADOSql.cpp : ¶¨Òå DLL Ó¦ÓóÌÐòµÄµ¼³öº¯Êý¡£
//
#include "stdafx.h"
#define ADO_API
#include "ADOSql.h"
#import "c:\\program files\\common files\\system\\ado\\msado15.dll" no_namespace rename("EOF", "adoEOF")
struct ADOConn
{
_ConnectionPtr connPtr;
};
static void ADO_GetFieldValue(const _variant_t& var, char* value);
ADO_API Bool STDCALL ADO_Initialize()
{
HRESULT r = CoInitialize(NULL);
return r == S_OK || r == S_FALSE;
}
ADO_API void STDCALL ADO_Uninitialize()
{
CoUninitialize();
}
ADO_API struct ADOConn* STDCALL ADO_CreateConnection(const char* connString)
{
struct ADOConn* conn = NULL;
try
{
conn = new struct ADOConn;
if(FAILED(conn->connPtr.CreateInstance("ADODB.Connection")))
throw false;
if(FAILED(conn->connPtr->Open(connString, "", "", adConnectUnspecified)))
throw false;
}
catch (...)
{
if(conn != NULL)
{
if(conn->connPtr != NULL && (conn->connPtr->GetState() & adStateOpen))
{
conn->connPtr->Close();
}
delete conn;
conn = NULL;
}
}
return conn;
}
ADO_API void STDCALL ADO_DestroyConnection(struct ADOConn* conn)
{
try
{
conn->connPtr->Close();
conn->connPtr.Release();
delete conn->connPtr;
}
catch(...)
{
}
}
ADO_API Bool STDCALL ADO_Exec(struct ADOConn* conn, const char* sql)
{
try
{
return conn->connPtr->Execute(sql, NULL, adCmdText);
}
catch(...)
{
return False;
}
}
ADO_API void STDCALL ADO_Query(struct ADOConn* conn, const char* sql, ADOQueryCallback cb, void* user)
{
_RecordsetPtr rs;
try
{
rs.CreateInstance("ADODB.Recordset");
if (SUCCEEDED(rs->Open(sql, conn->connPtr.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText)))
{
long fieldCount = rs->GetFields()->GetCount();
std::auto_ptr<struct ADOFieldInfo> ptr(new struct ADOFieldInfo[fieldCount]);
rs->MoveFirst();
while(!rs->adoEOF)
{
memset(ptr.get(), 0, sizeof(struct ADOFieldInfo) * fieldCount);
for (long i = 0; i < fieldCount; i++)
{
struct ADOFieldInfo* info = ptr.get() + i;
strncpy(info->name, rs->GetFields()->GetItem(i)->GetName(), ADO_FIELD_NAME_LEN);
ADO_GetFieldValue(rs->GetCollect(i), info->value);
}
(*cb)(ptr.get(), fieldCount, user);
rs->MoveNext();
}
rs->Close();
}
}
catch(...)
{
if(rs != NULL && (rs->GetState() & adStateOpen))
{
rs->Close();
}
}
}
//////////////////////////////////////////////////////////////////////////
static void ADO_GetFieldValue(const _variant_t& var, char* value)
{
switch(var.vt)
{
case VT_EMPTY:
case VT_NULL:
break;
case VT_DECIMAL:
sprintf(value, "%I64d", (LONGLONG)var);
break;
case VT_I1:
sprintf(value, "%c", (char)var);
break;
case VT_UI1:
sprintf(value, "%u", (BYTE)var);
break;
case VT_I2:
sprintf(value, "%d", (SHORT)var);
break;
case VT_UI2:
sprintf(value, "%u", (USHORT)var);
break;
case VT_I4:
sprintf(value, "%d", (INT32)var);
break;
case VT_UI4:
sprintf(value, "%u", (UINT32)var);
break;
case VT_I8:
sprintf(value, "%I64d", (LONGLONG)var);
break;
case VT_UI8:
sprintf(value, "%I64u", (ULONGLONG)var);
case VT_R4:
sprintf(value, "%f", (float)var);
break;
case VT_R8:
sprintf(value, "%f", (double)var);
break;
case VT_BOOL:
sprintf(value, "%d", (bool)var);
break;
case VT_DATE:
{
SYSTEMTIME st;
VariantTimeToSystemTime(var, &st);
sprintf(value, "%04d-%02d-%02d %02d:%02d:%02d.%03d",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
}
break;
case VT_BSTR:
strncpy(value, static_cast<const char*>((_bstr_t)var), ADO_FIELD_VALUE_LEN);
break;
default:
assert(0);
break;
}
}