调试了半天,原来是忽略了字符编码的问题。
我的工程UNiCODE编码,但是我在传参数的时候传的const char*,我一直以为是我装sql2012的问题,折腾了半天的数据库,把该开的服务都开了,还是连接不上。
快绝望的时候,看自己的连接字符串:
m_retCode = ::SQLDriverConnect(m_hdbc, NULL, (SQLWCHAR*)pszDSN, SQL_NTS, szOutConn, SQL_MAX_CONN_COUNT, &sOutConn, SQL_DRIVER_COMPLETE);感觉有点不靠谱。
所以写了个转换字符串的函数:
SQLWCHAR* CDBSqlServer::CharToWchar(const char* c)
{
SQLWCHAR *m_wchar;
int len = MultiByteToWideChar(CP_ACP, 0, c, strlen(c), NULL, 0);
m_wchar = new SQLWCHAR[len + 1];
MultiByteToWideChar(CP_ACP, 0, c, strlen(c), m_wchar, len);
m_wchar[len] = '\0';
return m_wchar;
}再调试下,果然连接上了。o(╯□╰)o。。。说明我的代码习惯的确不好。。。要自己反省哇。。。。。
完整函数如下:
LPSTR pDSN = "DRIVER={SQL Server};SERVER=SH-LIUGAO;DATABASE=uu278;UID=lg2;PWD=lg456&&;";bool CDBSqlServer::DriverConnectSqlServer(LPSTR pszDSN)
{
SQLTCHAR szOutConn[SQL_MAX_CONN_COUNT] = { 0 };
short sOutConn = 0;
SQLWCHAR* pszWDSN = CharToWchar(pszDSN);
if (!pszWDSN)
{
return false;
}
m_retCode = ::SQLDriverConnect(m_hdbc, NULL, pszWDSN, SQL_NTS, szOutConn, SQL_MAX_CONN_COUNT, &sOutConn, SQL_DRIVER_COMPLETE);
if (!ODBC_SUCCEED(m_retCode))
{
GetError();
return false;
}
m_retCode = ::SQLAllocHandle(SQL_HANDLE_STMT, m_hdbc, &m_hstmt);
if (!ODBC_SUCCEED(m_retCode))
{
GetError();
return false;
}
//释放前面创建的字符串
if (pszWDSN)
{
delete[] pszWDSN;
pszWDSN = NULL;
}
m_bConnected = true;
return true;
}
在使用SQLDriverConnect连接SQL2012时遇到问题,最初怀疑是数据库配置问题,但实际上是由于工程采用UNICODE编码,而传递的参数为const char*导致的。通过修改连接字符串,使用SQLWCHAR转换参数,成功解决连接问题。
5333

被折叠的 条评论
为什么被折叠?



