You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

107 lines
2.5 KiB

#include "ado.h"
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
HRESULT hr;
bool open(char* username, char* password, char* dbname, char* ip)
{
try
{
::CoInitialize(NULL); //初始化COM环境
m_pConnection.CreateInstance(__uuidof(Connection)); //创建连接对象
char connStr[200] = "";
sprintf(connStr, "Provider=SQLOLEDB;Data Source=%s;Initial Catalog=%s;", ip, dbname);
hr = m_pConnection->Open(connStr, username, password, -1);
if (hr != S_OK)
return true;
}
catch (_com_error e)
{
return true;
}
return false;
}
// 有输入参数的查询
int QuerySQL(char *SQL, int inputValueCount, int * outputColumn, int * outputValueCount, char **** outputValue)
{
Fields * fields = NULL;
long ColCount = 0;
*outputColumn = 0;
*outputValueCount = 0;
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->Open(SQL, m_pConnection.GetInterfacePtr(), adOpenStatic, adLockOptimistic, adCmdText);
hr = m_pRecordset->get_Fields(&fields); //得到记录集的字段集和
if (SUCCEEDED(hr))
{
fields->get_Count(&ColCount);
*outputValueCount = (int)ColCount;
}
if (*outputValueCount == 0)
return 0;
int index = 0;
// 开始分配内存并且存储
*outputValue = (char ***)calloc((*outputValueCount) + 1, sizeof(char**));
while (!m_pRecordset->adoEOF)
{
(*outputValue)[index] = (char **)calloc((*outputColumn) + 1, sizeof(char *));
for (long i = 0; i < ColCount; i++)
{
BSTR bstrColName=NULL;
fields->Item[i]->get_Name(&bstrColName);
(*outputValue)[index][i] = (char *)calloc(1000, sizeof(char));
_variant_t taskStyle = NULL;
taskStyle = m_pRecordset->GetCollect(bstrColName);
const char* str;
_bstr_t bst_t = (_bstr_t)taskStyle;
str = (const char*)bst_t;
strcpy((*outputValue)[index][i], str);
}
m_pRecordset->MoveNext();///移到下一条记录
index++;
}
return 0;
}
// 执行查询
int QuerySQLNoInputParam(char *SQL, int * outputColumn, int * outputValueCount, char **** outputValue)
{
return QuerySQL(SQL, 0, outputColumn, outputValueCount, outputValue);
}
// 执行删除更新
int ExecuteSQLNoInputParam(char *SQL)
{
return ExecuteSQL(SQL, 0, NULL);
}
int ExecuteSQL(char *SQL, int valueCount, char **value)
{
try
{
m_pConnection->Execute(_bstr_t(SQL), 0, adCmdText);
}
catch (_com_error e)
{
printf("插入失败\n");
printf(e.Description());
return -1;
}
return 0;
}
void close(void)
{
if (m_pRecordset != NULL) {
//m_pRecordset->MoveFirst();
m_pRecordset->Close();
m_pConnection->Close();
}
::CoUninitialize(); //释放环境
}