调试了半天,原来是忽略了字符编码的问题。

我的工程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;

}



更多相关文章

  1. 使用带有派生列的SQL排名函数
  2. 如何通过使用where子句与字符串格式(varchar(103),...,10)将103格式化
  3. 数据库截取字符串SUBSTR函数的使用
  4. SQL Server CLR函数类型不匹配。
  5. MySQL中的字符串模式匹配
  6. 从SQL字符串分割多桩分隔符
  7. mysql中MAX()函数MIN()函数
  8. ORACLE-SQL:定义并使用多字符串变量
  9. MySQL 中的函数(一:数学函数)

随机推荐

  1. Android中横竖屏、全屏、无标题设置
  2. 2010.11.27———android 展示网络上的图
  3. Android中的集中常用布局方式和按钮事件
  4. LayoutAnimation
  5. 在Android上执行Java程序
  6. Android创建自定义键盘
  7. zxing项目源码解读(2.3.0版本,Android部分)
  8. Android Service小实践
  9. Android使用Intent实现页面跳转
  10. Java和Javascript互调的例子 ---------(An