RT
解决方案 »
- mysql 的Navicat for MySQL链接
- 求centos系统下 xtrabackup备份工具的下载安装文档!
- phpmyadmin同时管理多个数据库
- postgres在fat32下如何启动他的服务
- 请问关于mysql的最大连接数的问题,在线等!
- 初次接触mysql,请教mysql在linux 下中文显示问题!
- 急!!!!!请帮忙~~~~内部网络的检索服务系统,通过internet也可以访问?
- 求正则表达式
- MySql中 select a from (select a,b from table) 报语法错
- 几句sql效率差异请教。。。
- 能不能在索引上添加字段?
- 2个表的联合查询,各位高手请进!
MyODBC::MyODBC(DataBaseType db_type,const char* driver,const char* dsn,
const char* server,const char* db_name,const char* description,USHORT port)
{
m_erro = 0;
m_row_count = 0;
memset(m_sql_state,0,sizeof(m_sql_state)); memset(m_dsn,0,sizeof(m_dsn));
strncpy(m_dsn,dsn,sizeof(m_dsn) - 1); m_db_type = db_type; memset(m_db_name,0,sizeof(m_db_name));
strncpy(m_db_name,db_name,sizeof(m_db_name) - 1); memset(m_driver,0,sizeof(m_driver));
strncpy(m_driver,driver,sizeof(m_driver) - 1); memset(m_description,0,sizeof(m_description));
strncpy(m_description,description,sizeof(m_description) - 1); memset(m_ip,0,sizeof(m_ip));
strncpy(m_ip,server,sizeof(m_ip) - 1); char szPort[20];
memset(szPort,0,sizeof(szPort));
sprintf(szPort,"%d",port);
m_port = port; char szAttributes[sizeof(m_dsn) + sizeof(m_ip) + sizeof(m_db_name) + sizeof(m_description) + 1];
memset(szAttributes,0,sizeof(szAttributes));
char* p = szAttributes; sprintf(szAttributes,"DSN=%s\nServer=%s\nDatabase=%s\nDescription=%s",m_dsn,m_ip,m_db_name,m_description);
PR_DEBUG("this is port:%d\ndriver:%s\nAttributes:\n%s",port,driver,szAttributes);
while( *p )
{
if( *p == '\n' )
*p = '\0'; p++;
} if( SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN, (LPSTR)driver, (LPSTR)szAttributes) )
PR_DEBUG("create data source successful!");
else
PR_ERR("create data source fail!"); //create odbc env handle
if(SQLAllocHandle(SQL_HANDLE_ENV,NULL,&m_hEnv) == SQL_SUCCESS )
PR_DEBUG("create env handle success!");
else
PrintErroLog(SQL_HANDLE_ENV,m_hEnv); //set odbc env version 3
SQLSetEnvAttr(m_hEnv, SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
//create db handle
if(SQLAllocHandle(SQL_HANDLE_DBC,m_hEnv,&m_hDBC) == SQL_SUCCESS )//在ODBC 版本3 中,SQLAllocConnect() 已被废弃,而被替换为SQLAllocHandle();
PR_DEBUG("create db handle success!");
else
PrintErroLog(SQL_HANDLE_DBC,m_hDBC);
}//建立连接
int MyODBC::Connect(const char* user,const char* passwd)
{
if( m_user != user )
{
memset(m_user,0,sizeof(m_user));
strncpy(m_user,user,sizeof(m_user) - 1);
} if( m_passwd != passwd )
{
memset(m_passwd,0,sizeof(m_passwd));
strncpy(m_passwd,passwd,sizeof(m_passwd) - 1);
} PR_DEBUG("user:%s,passwd:%s",m_user,m_passwd); //connect db server
if( SQLConnect(m_hDBC, (SQLCHAR*) m_dsn, SQL_NTS,(SQLCHAR*) m_user, SQL_NTS, (SQLCHAR*) m_passwd, SQL_NTS) == SQL_SUCCESS )
PR_DEBUG("connect db server success!");
else
{
PrintErroLog(SQL_HANDLE_DBC,m_hDBC);
if( m_db_type == SQLSERVER && ( m_erro == 5701 || m_erro == 5703 ) )
;
else
{
PR_ERR("connect db server erro!");
return -1;
}
} //create sql handle
if(SQLAllocHandle(SQL_HANDLE_STMT,m_hDBC,&m_hSTMT) == SQL_SUCCESS )
PR_DEBUG("create sql handle success!");
else
{
PrintErroLog(SQL_HANDLE_STMT,m_hSTMT);
return -1;
} int timeout = 10;
if( SQLSetStmtAttr(m_hDBC,SQL_ATTR_QUERY_TIMEOUT,&timeout,SQL_IS_INTEGER) == SQL_SUCCESS )
PR_DEBUG("set timout attr success!");
else
PrintErroLog(SQL_HANDLE_DBC,m_hDBC);
//支持事务自动提交
if( SQLSetConnectAttr(m_hDBC,SQL_ATTR_AUTOCOMMIT,(SQLPOINTER) SQL_AUTOCOMMIT_ON,SQL_IS_POINTER) == SQL_SUCCESS )
PR_DEBUG("set autocommit on success!");
else
PrintErroLog(SQL_HANDLE_DBC,m_hDBC);
//设置sql为同步方式执行
if( SQLSetConnectAttr( m_hDBC, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER) SQL_AUTOCOMMIT_ON, SQL_IS_POINTER) == SQL_SUCCESS )
PR_DEBUG("set timout attr success!");
else
PrintErroLog(SQL_HANDLE_DBC,m_hDBC);
return 0;
}
能不能具体些,还有要添加哪些头文件以及LINK库呢,谢谢
#include <iostream>
#include <windows.h>
#include <odbcinst.h>
2、执行sql。
在执行SQL语句时可以利用SQLPrepare 和SQLExecute 的组合来代替SQLExecDirect函数。
在准备阶段ODBC会分析SQL语句并分配各种资源,在执行阶段才正式执行刚才准备好的SQL语句。//使用SQLExecute执行和SQLExecDirect 执行后的STMT句柄可以进行相同的操作,例如使用SQLFetch取得结果集。
不过准备-执行模式一般用来执行各种大批量的数据修改,而不是用来执行查询语句。
此外对于那些需要反复执行的SQL语句利用准备-执行模式会比反复执行SQLExecDirect 速度快。