如何在程序中打开odbc数据源管理器?

不假思索 2015-01-25 07:33:38
网上搜索了一下午,还是没找到。还是来这里请大家伙帮忙吧!

一是如何在程序中打开odbc数据源管理器?
二是如何在程序中从odbc数据源管理器选择数据源?

windows应该有这方面的标准函数吧?
.net是不是也有相应的类、对话框?

...全文
306 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
encoderlee 版主 2015-01-27
  • 打赏
  • 举报
回复
CDatabase也是封装了ODBC API,ODBC API和Windows API一样,在NET里也可以调用. 看一下MFC中CDatabase::Open的源码,其实也是调用了ODBC API的SQLAllocConnect创建ODBC句柄, 然后用SQLDriverConnect连接,调用SQLDriverConnect的时候,第三个参数InConnectionString传入一个空字符串, 就会弹出ODBC数据源选择窗口,供用户选择和配置,用户选择完毕以后,SQLDriverConnect的第五个参数OutConnectionString便会返回用户所选的数据源的ODBC连接字符串。 不过NET中一般不通过ODBC访问数据库吧,而且ODBC API调用起来也非常麻烦,NET中一般通过ADO.NET来访问数据库,ADO.NET我就不清楚了,你可以查一下MSDN关于ADO.NET的资料
不假思索 2015-01-27
  • 打赏
  • 举报
回复
哦,看到了。多谢! .net里有类似的类吗?
引用 4 楼 CharlesSimonyi 的回复:
你是在MFC中使用ODBC吧,那样的话用CDatabase::Open()打开数据库时, 第一个参数LPCTSTR lpszDSN数据源参数写NULL,就会弹出ODBC数据源选择对话框供用户选择。
不假思索 2015-01-27
  • 打赏
  • 举报
回复
我就是在ADO.NET里找不到调出ODBC数据源管理器的类才来这里问。 .NET里在程序里直接把DSN或连接字符串写进去我就会,但我要给用户足够的灵活性,不能把数据源锁死,所以想调用ODBC数据源管理器。 看样子还是只能在.NET里用CDatabase了。 多谢!
引用 7 楼 CharlesSimonyi 的回复:
CDatabase也是封装了ODBC API,ODBC API和Windows API一样,在NET里也可以调用. 看一下MFC中CDatabase::Open的源码,其实也是调用了ODBC API的SQLAllocConnect创建ODBC句柄, 然后用SQLDriverConnect连接,调用SQLDriverConnect的时候,第三个参数InConnectionString传入一个空字符串, 就会弹出ODBC数据源选择窗口,供用户选择和配置,用户选择完毕以后,SQLDriverConnect的第五个参数OutConnectionString便会返回用户所选的数据源的ODBC连接字符串。 不过NET中一般不通过ODBC访问数据库吧,而且ODBC API调用起来也非常麻烦,NET中一般通过ADO.NET来访问数据库,ADO.NET我就不清楚了,你可以查一下MSDN关于ADO.NET的资料
mxway 2015-01-27
  • 打赏
  • 举报
回复
第一个问题在你的代码中加入:WinExec("%windir%\system32\odbcad32.exe",SW_SHOW);即可打开odbc管理器。第一个参数是你的odbc可执行文件的路径。
encoderlee 版主 2015-01-26
  • 打赏
  • 举报
回复
你是在MFC中使用ODBC吧,那样的话用CDatabase::Open()打开数据库时, 第一个参数LPCTSTR lpszDSN数据源参数写NULL,就会弹出ODBC数据源选择对话框供用户选择。
不假思索 2015-01-26
  • 打赏
  • 举报
回复
目的不是添加一个数据源、或者建立一个数据库连接, 而是打开控制面板里的odbc数据源管理器,让用户 1、自己添加、修改一个数据源。 2、自己选择一个数据源,提取连接参数返回给调用程序。
hlx_beat 2015-01-25
  • 打赏
  • 举报
回复

CADODB.h

#ifndef CADODB_FILE
#define CADODB_FILE
#include <Windows.h>
#include <string>

#import "C:\Program Files\Common Files\System\ado\msado15.dll"\
	no_namespace\
	rename("EOF","adoEOF")

class CADO
{
public:
	CADO();
	~CADO();
	HRESULT		Connection();
	HRESULT		Execute();
	HRESULT		Login(std::string str);
	void		Close();

private:
	HRESULT		InitDB();

	//打开记录集
	HRESULT		OpenRecordSet();
	//从打开的记录集中读取返回的结果
	HRESULT		ReadRecordSet();
	HRESULT			hr;
	VARIANT			var;
	_ConnectionPtr	m_pConnection;
	_RecordsetPtr	m_pRecordset;
	_CommandPtr		m_pCommand;

	std::string		m_strUser;
	std::string		m_strPwd;
	std::string		m_strDB;
	std::string		m_strIP;
	std::string		m_strPort;
	std::string		m_strTable;
};

#endif

CADODB.cpp

#include "CADODB.h"
#include "CReadIni.h"
#include <iostream>

CADO::CADO()
{
	m_pConnection	= NULL;
	m_pRecordset	= NULL;
	m_pCommand		= NULL;
	InitDB();
}
CADO::~CADO()
{
	
}
void CADO::Close()
{
	try{
		if(m_pRecordset->State)
		{
			m_pConnection->Close();
			m_pConnection	= NULL;
		}
		if(m_pConnection->State)
		{
			m_pConnection->Close();
			m_pConnection	= NULL;
		}
	}
	catch (_com_error e)
	{
		std::cout<<e.ErrorMessage()<<endl;
		hr	= S_FALSE;
	}
}
HRESULT	 CADO::InitDB()
{
	try
	{
		hr = CoInitialize(NULL);
		if(!m_pConnection)
		{
			hr = m_pConnection.CreateInstance("ADODB.Connection");
			if(FAILED(hr))
			{
				std::cout<<"m_pConnection 创建失败"<<std::endl;
			}
		}
		if(!m_pRecordset){
			hr = m_pRecordset.CreateInstance(__uuidof(Recordset));
			if(FAILED(hr)){
				std::cout<<"m_pRecordset 创建失败"<<std::endl;
			}
		}
	}
	catch (_com_error e)
	{
		std::cout<<e.ErrorMessage()<<endl;
		hr	= S_FALSE;
	}
	return hr;
}
HRESULT	 CADO::Connection()
{
	_LSTR strtemp[20];
#ifdef _UNICODE
	char	temp[20];
	XReadIni().SetFileName(L"config.ini");
	XReadIni().GetString(L"DB",L"IP",strtemp);
	XReadIni().WideCharToMultiByte(strtemp,temp);
	m_strIP	= temp;
	XReadIni().GetString(L"DB",L"DB",strtemp);
	XReadIni().WideCharToMultiByte(strtemp,temp);
	m_strDB	= temp;
	XReadIni().GetString(L"DB",L"user",strtemp);
	XReadIni().WideCharToMultiByte(strtemp,temp);
	m_strUser	= temp;
	XReadIni().GetString(L"DB",L"pwd",strtemp);
	XReadIni().WideCharToMultiByte(strtemp,temp);
	m_strPwd	= temp;
#else
	XReadIni().SetFileName("config.ini");
	XReadIni().GetString("DB","IP",strtemp);
	m_strIP	= strtemp;
	XReadIni().GetString("DB","DB",strtemp);
	m_strDB	= strtemp;
	XReadIni().GetString("DB","user",strtemp);
	m_strUser	= strtemp;
	XReadIni().GetString("DB","pwd",strtemp);
	m_strPwd	= strtemp;
#endif
	try{
		std::string DBConnect;
		DBConnect	= "Driver=SQL Server;Server="
			+ m_strIP + ",1991;DATABASE="
			+ m_strDB + ";UID="
			+ m_strUser + ";PWD="
			+ m_strPwd;
		//超时
		hr	= m_pConnection->put_ConnectionTimeout(long(5));

		hr = m_pConnection->Open(DBConnect.c_str(),"","",adModeUnknown);
		if(SUCCEEDED(hr))
		{
			std::cout<<"连接成功"<<std::endl;
			//连接时间
			m_pConnection->put_CommandTimeout(long(5));
		}
	}
	catch(_com_error e)
	{
		std::cout<<e.ErrorMessage()<<endl;
		hr	= S_FALSE;
	}
	return hr;
}
HRESULT CADO::Execute()
{
	hr	= OpenRecordSet();
	if(SUCCEEDED(hr))
	{
		hr	= ReadRecordSet();
	}
	return hr;
}
HRESULT	 CADO::OpenRecordSet()
{
	try{
		hr	= m_pRecordset->Open("Select * from UserInfo where u_id=123456789 and u_PassWord='ABCDabcd'",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
	}
	catch(_com_error e){
		std::cout<<e.ErrorMessage()<<endl;
		hr	= S_FALSE;
	}
	return hr;
}
HRESULT		CADO::Login(std::string str)
{
	try{
		hr	= m_pRecordset->Open(str.c_str(),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
		if(SUCCEEDED(hr))
		{
			hr = ReadRecordSet();
		}
	}
	catch(_com_error e){
		std::cout<<e.ErrorMessage()<<endl;
		hr	= S_FALSE;
	}
	return hr;
}
HRESULT	 CADO::ReadRecordSet()
{
	long int u_id;
	std::string u_name;
	std::string u_nickname;
	std::string u_pwd;
	try{

		while(!m_pRecordset->adoEOF){
			var	= m_pRecordset->GetCollect("u_Id");
			u_id	= var.lVal;
			var	= m_pRecordset->GetCollect("u_Name");
			u_name	= (char*)_bstr_t(var);
			var	= m_pRecordset->GetCollect("u_PassWord");
			u_pwd	= (char*)_bstr_t(var);
			var	= m_pRecordset->GetCollect("u_NickName");
			u_nickname	= (char*)_bstr_t(var);
			hr	= m_pRecordset->MoveNext();
		}
	}
	catch(_com_error e)
	{
		std::cout<<e.ErrorMessage()<<endl;
		hr	= S_FALSE;
	}
	return	 hr;
}


野男孩 2015-01-25
  • 打赏
  • 举报
回复
目的是啥??如果只是为了设置odbc数据源,可以用API直接设置. 比如用SQLConfigDataSource,配置数据源连接字符串,用户名,密码什么的,都能指定了

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧