RT

解决方案 »

  1.   

    //初始化dsn
    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;
    }
      

  2.   

    例如我要执行creat table t_1(FUser varchar(20)); 该放在哪儿呢,
    能不能具体些,还有要添加哪些头文件以及LINK库呢,谢谢
      

  3.   

    1、包含头文件:
    #include <iostream>
    #include <windows.h>
    #include <odbcinst.h>
    2、执行sql。
    在执行SQL语句时可以利用SQLPrepare 和SQLExecute 的组合来代替SQLExecDirect函数。
    在准备阶段ODBC会分析SQL语句并分配各种资源,在执行阶段才正式执行刚才准备好的SQL语句。//使用SQLExecute执行和SQLExecDirect 执行后的STMT句柄可以进行相同的操作,例如使用SQLFetch取得结果集。
    不过准备-执行模式一般用来执行各种大批量的数据修改,而不是用来执行查询语句。
    此外对于那些需要反复执行的SQL语句利用准备-执行模式会比反复执行SQLExecDirect 速度快。