获取ODBC数据源

该代码段展示了在ODBC中分配环境句柄,设置环境属性为ODBC3版本,获取用户数据源并处理可能的错误的过程。通过SQLDataSources函数列出可用的数据源,并将它们添加到列表中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQLHENV henv;
SQLRETURN rtcode;
rtcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if(rtcode != SQL_SUCCESS)
{
	SQLTCHAR Sqlstate[6];
	SQLINTEGER NativeError;
	SQLTCHAR ErrMsg[SQL_MAX_MESSAGE_LENGTH];
	int i=1;
	while(SQLGetDiagRec(SQL_HANDLE_ENV, henv, i, Sqlstate, &NativeError, ErrMsg, sizeof(ErrMsg), NULL) != SQL_NO_DATA)
	TRACE("Diag:%d,SQLSTATE:%s,NativeError:%d, ErrMsg:%s\n", i++, Sqlstate, NativeError, ErrMsg);
}	

rtcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
if(rtcode != SQL_SUCCESS)
{
	SQLTCHAR Sqlstate[6];
	SQLINTEGER NativeError;
	SQLTCHAR ErrMsg[SQL_MAX_MESSAGE_LENGTH];
	int i=1;
	while(SQLGetDiagRec(SQL_HANDLE_ENV, henv, i, Sqlstate, &NativeError, ErrMsg, sizeof(ErrMsg), NULL) != SQL_NO_DATA)
	TRACE("Diag:%d,SQLSTATE:%s,NativeError:%d, ErrMsg:%s\n", i++, Sqlstate, NativeError, ErrMsg);
}	

SQLTCHAR ServerName[MAX_LENTH] = {0}, Description[MAX_LENTH] = {0};

SQLSMALLINT ServerNameLength, DescNameLength;
/*rtcode = SQLDataSources(henv, SQL_FETCH_FIRST_SYSTEM, ServerName, MAX_LENTH, &ServerNameLength, Description, MAX_LENTH, &DescNameLength);*/
rtcode = SQLDataSources(henv, SQL_FETCH_FIRST_USER, ServerName, MAX_LENTH, &ServerNameLength, Description, MAX_LENTH, &DescNameLength);
if(rtcode != SQL_SUCCESS)
{
	SQLTCHAR Sqlstate[6];
	SQLINTEGER NativeError;
	SQLTCHAR ErrMsg[SQL_MAX_MESSAGE_LENGTH];
	int i=1;
	while(SQLGetDiagRec(SQL_HANDLE_ENV, henv, i, Sqlstate, &NativeError, ErrMsg, sizeof(ErrMsg), NULL) != SQL_NO_DATA)
	TRACE("Diag:%d,SQLSTATE:%s,NativeError:%d, ErrMsg:%s\n", i++, Sqlstate, NativeError, ErrMsg);
}

if(rtcode == SQL_NO_DATA)
{
	TRACE("NO Data Source!");
}
else
{
	m_ctlUserList.AddString((LPCTSTR)((LPCWSTR)ServerName));
    do 
	{
		rtcode = SQLDataSources(henv, SQL_FETCH_NEXT, ServerName, MAX_LENTH, &ServerNameLength, Description, MAX_LENTH, &DescNameLength);
		if(rtcode != SQL_NO_DATA) 
		m_ctlUserList.AddString((LPCTSTR)((LPCWSTR)ServerName));	
		if(rtcode != SQL_SUCCESS)
		{
			SQLTCHAR Sqlstate[6];
			SQLINTEGER NativeError;
			SQLTCHAR ErrMsg[SQL_MAX_MESSAGE_LENGTH];
			int i=1;
			while(SQLGetDiagRec(SQL_HANDLE_ENV, henv, i, Sqlstate, &NativeError, ErrMsg, sizeof(ErrMsg), NULL) != SQL_NO_DATA)
			TRACE("Diag:%d,SQLSTATE:%s,NativeError:%d, ErrMsg:%s\n", i++, Sqlstate, NativeError, ErrMsg);
		}
	}while(rtcode != SQL_NO_DATA);
}
rtcode = SQLFreeHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE);
if(rtcode != SQL_SUCCESS)
{
	SQLTCHAR Sqlstate[6];
	SQLINTEGER NativeError;
	SQLTCHAR ErrMsg[SQL_MAX_MESSAGE_LENGTH];
	int i=1;
	while(SQLGetDiagRec(SQL_HANDLE_ENV, henv, i, Sqlstate, &NativeError, ErrMsg, sizeof(ErrMsg), NULL) != SQL_NO_DATA)
	TRACE("Diag:%d,SQLSTATE:%s,NativeError:%d, ErrMsg:%s\n", i++, Sqlstate, NativeError, ErrMsg);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值