请问在dll中使用数据库连接的问题
我用VC 2003新建了一个dll项目,在其中添加了连接操作mysql数据库的代码(ODBC方式),再用另一个项目调用该dll,发现无效,而直接在应用程序中这样做是正确的,由于本人对VC和Dll开发都不熟悉,不知道问题出在什么地方,代码如下:
odbcManager.cpp//dll在此实现
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <odbcss.h>
/* 定义一些在数据库操作中用到的全局变量 */
#define MAXBUFLEN 255
/* 以下为对odbc数据源的具体操作部分 */
// 连接odbc数据源,传递三个参数:DSN名,用户名,用户密码
char * odbcExecute(char * dsnname, char * user, char * passwd, char * sql)
{
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc = SQL_NULL_HDBC;
SQLHSTMT hstmt = SQL_NULL_HSTMT;
RETCODE retcode;
SQLCHAR result[MAXNAME+1];
SQLINTEGER sqlint;
// out为返回的结果字符串
char * out ;
retcode = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
retcode = SQLConnect(hdbc, (SQLCHAR *)dsnname, SQL_NTS, (SQLCHAR *)user, SQL_NTS, (SQLCHAR *)passwd, SQL_NTS);
if(retcode == SQL_SUCCESS)
{
// 执行sql语句,并返回结果
// ps.由于从LoadRunner中调用的角度讲,此时所期望得到的只是单一的数据,因此返回的是数据库中的第一条记录,且长度不能超过128
// 对于此处的程序设计,目前不太合理,今后会加以优化
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
retcode = SQLPrepare(hstmt, (SQLCHAR *)sql, SQL_NTS);
retcode = SQLExecute(hstmt);
retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, result, MAXNAME, &sqlint);
if(SQLFetch(hstmt) != SQL_NO_DATA)
{
out = (char *)result;
}
else
{
out = "Execute Error ";
}
}
else
{
out = "Connect Error ";
}
// 关闭连接,清理环境
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return out;
}
odbcManager.h//
#ifndef LIB_H
#define LIB_H
//以extern type "C " __declspec(dllexport)形式声明可被外界调用的函数
//extern "C " char * __declspec(dllexport) odbcConnect(char * dsnname, char * user, char * passwd);
extern "C " char * __declspec(dllexport) odbcExecute(char * dsnname, char * user, char * passwd, char * sql);
#endif
用来调试的应用程序代码如下
call.cpp
// call.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h "
#include "windows.h "
typedef char * (*lpAddFun)(char *, char *, char *, char *);
int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hDll;
lpAddFun addFun;
hDll = LoadLibrary( "odbcManager.dll ");
if(hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "odbcExecute ");
if(addFun != NULL)
{
char * res = addFun( "test ", "root ", "suzsoft ", "SELECT passwd FROM user ");
printf( "%s ", res);
}
FreeLibrary(hDll);
}
else
{
}
return 0;
}
[解决办法]
把char * __declspec(dllexport)的顺序一改就行了
还有__declspec用一个下划线,即_declspec就行