用的是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;
}
由于是刚学习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;
}
你看看http://www.soft6.com/tech/13/131401.html有没有帮助,我一向都用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();
}