首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请教在dll中使用数据库连接的有关问题

2012-03-07 
请问在dll中使用数据库连接的问题我用VC2003新建了一个dll项目,在其中添加了连接操作mysql数据库的代码(OD

请问在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就行

热点排行