用的是SQL Native Client中的ODBC编程,以release方式可以通过编译并运行,但连接数据库时错误,不知什么原因?
由于是刚学习VS2008环境下编程,很多都是凑起来的,大家帮忙吧程序如下:// ODBCTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <sqlncli.h>
#include < iostream >
#include < stdlib.h >#include < vcclr.h >
using namespace std;
//using namespace cli;
int _tmain(int argc, _TCHAR* argv[])
{
SQLRETURN r;
SQLHANDLE phenv, phdbc;r = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &phenv);// This is an ODBC v3 application
r = SQLSetEnvAttr(phenv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, 0);
if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) {
cout < <"connect Database succeed" < <endl;
}// Choose one of the following to test with or without connection pooling
// r = SQLSetEnvAttr(henv, SQL_ATTR_CONNECTION_POOLING, (SQLPOINTER) SQL_CP_ONE_PER_DRIVER, 0);
r = SQLSetEnvAttr(phenv, SQL_ATTR_CONNECTION_POOLING, (SQLPOINTER) SQL_CP_OFF, 0);
if (r != SQL_SUCCESS && r != SQL_SUCCESS_WITH_INFO) {
cout < <"set envy st tr error!" < <endl;
exit(-1);
}
cout < <"set env attr succeed!" < <endl;
r = SQLAllocHandle(SQL_HANDLE_DBC, phenv, &phdbc);r = SQLSetConnectAttr(phdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER) SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER);
if (r != SQL_SUCCESS && r != SQL_SUCCESS_WITH_INFO) {
cout < <"set connect attr error!" < <endl;
exit(-1);
}
cout < <"set connect attr succeed!" < <endl;char* szConnStrIn="Driver={SQL Server Native Client 10.0};Server=127.0.0.1\\BUPT;Database=test;Integrated Security=True;";
cout < <szConnStrIn < <endl;
r = SQLDriverConnect(phdbc,
NULL,
(SQLWCHAR*)szConnStrIn,
SQL_NTS,
NULL,
0,
NULL,
SQL_DRIVER_NOPROMPT);
//r=SQLConnect(phdbc,);if (r != SQL_SUCCESS && r != SQL_SUCCESS_WITH_INFO) {
cout < <"连接失败!" < <endl;return -1;
}
cout < <r < <endl;
return 0;

解决方案 »

  1.   

    你的代码有点奇怪,我没试过。
    你看看http://www.soft6.com/tech/13/131401.html有没有帮助,我一向都用ADO的
      

  2.   

    我希望用到双机热备功能,用到的是SQLSERVER2008的数据库镜像功能。如果想支持自动故障迁移,必须用ADO.NET或SQL NATIVE CLIENT方式,前者不熟悉,所以用后者后者又分为OLEDB和ODBC两种,所以选择ODBC情况就是如此,大家帮忙
      

  3.   

    用ADO多方便。//****************************************************************************************//
    //函数 GetSqlConnStr
    //主要功能: 得到SQL Server数据库的连接字符串
    //参数列表: 
    //         1、const char *szIp:sql server服务器IP
    //         2、const char *szDb:数据库名称
    //         3、const char *szUser:用户名
    //         4、const char *szPwd:密码
    //返回值: 
    //备注: 
    //****************************************************************************************//
    CString GetSqlConnStr(const char *szIp, const char *szDb, const char *szUser, const char *szPwd)
    {
    CString strSRC;
    strSRC = "Driver=SQL Server;Server=";
    strSRC += szIp;
    strSRC += ";Database=";
    strSRC += szDb;
    strSRC += ";UID=";
    strSRC += szUser;
    strSRC += ";PWD=";
    strSRC += szPwd;
    return strSRC;
    }
    //****************************************************************************************//
    //函数 ReadSqlData
    //主要功能: 读取SQL数据表数据
    //参数列表: 
    //         1、char *szSqlHost:sql server服务器IP
    //         2、char *szSqlDbName:数据库名
    //         3、char *szSqlTableName:表名
    //         4、char *szSqlUserName:用户名
    //         5、char *szSqlPassWord:密码
    //返回值: 
    //备注: 
    //****************************************************************************************//
    void ReadSqlData(char *szSqlHost, char *szSqlDbName, char *szSqlTableName, char *szSqlUserName, char *szSqlPassWord)
    {
    CString strSRC, strSQL;
    strSRC = GetSqlConnStr(szSqlHost, szSqlDbName, szSqlUserName, szSqlPassWord);
    strSQL.Format("select * from %s", szSqlTableName);
    _variant_t varSRC(strSRC);
    _variant_t varSQL(strSQL);
    _RecordsetPtr Rs;
    if(FAILED(Rs.CreateInstance("ADODB.RecordSet")))
    {
    AddLogMsg("创建记录集对象失败!");
    return;
    }
    try
    {
    if(FAILED(Rs->Open(varSQL,varSRC,adOpenStatic,adLockOptimistic,adCmdText)))
    {
    AfxMessageBox("Open table failed!");
    Rs.Release();
    return;
    }
    }
    catch(...)
    {
    AfxMessageBox("打开数据库出错!");
    return;
    }
    int nCount = Rs->GetRecordCount();
    CStringArray   saFieldName;
    for(long j = 0; j < Rs->Fields->Count; j++)
    {
    _variant_t varVal = Rs->GetFields()->GetItem((_variant_t)j)->GetName();
    CString strVal = (char *)_bstr_t(varVal);
    saFieldName.Add(strVal);
    }
    int nRec = 0;
    while(!Rs->GetadoEOF())
    {
    for(i = 0; i < saFieldName.GetSize(); i++)
    {
    CString strName = saFieldName.GetAt(i);
    _variant_t varVal = Rs->GetCollect(strName.GetBuffer());
    CString strVal = "";
    if(varVal.vt != VT_NULL)
    {
    strVal = (char*)_bstr_t(varVal);//得到各个字段的值
    strVal.Trim();
    }
    }
    Rs->MoveNext();
    }
    Rs->Close();
    Rs.Release();
    }