如何动态创建ODBC数据源?

wmouse 2002-05-10 04:07:52
我知道这个问题已经有很多人提过了,但是试来试去总有些问题,可能是自己笨。
具体要求:
1、数据库类型是SQLServer;Server在局域网中的其他机子上,名称是ServerA\MyServer(ServerA是机器名,MyServer是SQL Sever名);uid是sa;password为“”(空);数据库名称是MyTest。
2、用SQLConfigDataSource如何实现?大多数文档都是针对本地Server的,我关心Remote Server。
3、其他方法如何实现呢?曾看过很就之前蒋晟提到的方法(http://www.csdn.net/expert/topic/259/259474.xml),不过好像是连接远端的DSN,而不是自己创建。
谢谢!
...全文
85 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wmouse 2002-05-13
其实我现在就想明确一下“SERVER=”属性应该填写“ServerA\MyServer”吗?远程访问是否还需其它设置?
回复
茂纲 2002-05-11
http://www.csdn.net/expert/topic/567/567691.xml?temp=7.407779E-02

http://www.csdn.net/expert/topic/558/558491.xml?temp=.4215052
回复
xwyzl 2002-05-11
用SQLConfigDataSource创建SQL Server 数据源和 Access 差不多
lpszDriver = "SQL Server"
lpszAttributes = "DSN=dsnname\0SERVER=servername\0UID=user\0PWD=password\0DATABASE=defaultdb\0\0"

回复
wmouse 2002-05-10
托 1heart(一心) 的福,注册表方式我已经实现了,现在比较关心SQLConfigDataSource,谢谢wened(阿坟)
回复
wmouse 2002-05-10
谢谢大家的关心,不过我关心的是SQL Server的实现!
回复
wened 2002-05-10
留下Email,有个注册数据源工程,写注册表的
回复
anjy 2002-05-10
gz
回复
xwyzl 2002-05-10
void AddAttribute(char* pcAttributes,const char* pcAttribute)
{
char *pTemp = pcAttributes;
while(*pTemp != '\0' || *(pTemp+1) != '\0')
pTemp++;
strcat(pTemp+1,pcAttribute);
}

void CBookHireApp::CreateDSN()
{

char caDriver[]="Microsoft Access Driver (*.mdb)";
char caAttributes[300];

char caTemp[200],caDefDirectory[200];
GetCurrentDirectory(200,caTemp);
sprintf(caDefDirectory,"DefaultDir=%s\\database",caTemp);

memset(caAttributes,'\0',sizeof(caAttributes));
AddAttribute(caAttributes,"DSN=BookHire");
AddAttribute(caAttributes,"DBQ=BookHire.mdb");
AddAttribute(caAttributes,caDefDirectory);

if(!SQLConfigDataSource(
NULL,
ODBC_ADD_DSN,
caDriver,
caAttributes+1))
{
AfxMessageBox("创建数据源失败请检查Microsoft Access Driver 是否安装!");
}

}

SQLConfigDataSource参数格式看MSDN
回复
wmouse 2002-05-10
msdn上找不到比较全的lpszAttributes介绍,谁能详细介绍一下?
monkey_boy(陪哀家一起去沐浴) :
ADDRESS起什么作用?如果按我提的要求,“SERVER”这一项应当写“ServerA\MyServer”还是“MyServer”?
回复
茂纲 2002-05-10
SQLConfigDataSource可以创建数据源!但是需要注意一些问题


就是参数为char* 传入时的“\0”的问题



void SetODBC(int i)


{


if(i==0)//代表时初始化!


{


// SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,"Microsoft Access Driver (*.mdb)\0","DSN=dict?DBQ="+fullpath+"?DEFAULTDIR="+path+"??";);


}


else


{


CFileDialog fd(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"MDB Files (*.mdb)|*.mdb||",NULL);


int ret=fd.DoModal();


if(ret==IDOK)


{


int n=fd.GetPathName().GetLength()-fd.GetFileName().GetLength()-1;


CString path=fd.GetPathName().Left(n);


CString fullpath=fd.GetPathName();


CString test;


test="DSN=dict?DBQ="+fullpath+"?DEFAULTDIR="+path+"??";


int m=test.GetLength();


char *clear=new char[m];


clear=test.GetBuffer(m);


for(int i=0;i<=m;i++)


{


if(clear[i]=='?')


clear[i]='\0';


}


BOOL t=SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,"Microsoft Access Driver (*.mdb)\0",(LPCSTR)test);


if(t!=0)


AfxMessageBox("数据源设置成功!");


else


AfxMessageBox("数据源没有设置成功!");


}


}


}
回复
茂纲 2002-05-10
用VC程序来创建SQL Server ODBC数据源 simba99(原作)

关键字 创建SQL Server ODBC数据源



在发布与数据库相关的软件时,如果程序是用ODBC方式访问数据库,则需要在软件安装时创建ODBC数据源。
ODBC数据源的一些信息都存放在注册表中。

HKEY_LOCAL_MECHINE\Software\ODBC\ODBCINST.INI

从此键下可得知系统是否已经安装SQL Server驱动程序

HKEY_LOCAL_MECHINE\Software\ODBC\ODBC.INI

从此键下可得知系统已经建立的数据源.

实现函数如下:

//////////////////////////////////////////////////////////////////
//Function: MakeSQLServerODBCDSN
//
//Purpose: 配置SQL Server数据源
//Parameters:
// [in]
// strDBServer: 数据库所在主机
// strDBName: 数据库名称
// strDSN: 数据源名称
// strUID: 登陆用户
//Return Value:
// -1: 没有安装SQL Server驱动程序
// -2: 其他错误
// 0: 成功
//////////////////////////////////////////////////////////////////
int MakeSQLServerODBCDSN(LPCTSTR strDBServer,LPCTSTR strDBName,LPCTSTR strDSN,LPCTSTR strUID)
{
BOOL bInstallDriver=TRUE;
CRegKey regKey;

LONG lRet=regKey.Open(HKEY_LOCAL_MACHINE,"Software\\ODBC\\ODBCINST.INI\\SQL Server");
if(lRet!=ERROR_SUCCESS)
{
bInstallDriver=FALSE;
}
else
{
char szDirverPath[MAX_PATH]="";
DWORD dwCount=100;
lRet=regKey.QueryValue(szDirverPath,"Driver",&dwCount);
if((lRet!=ERROR_SUCCESS)||(dwCount<1))
{
DWORD dwErr=GetLastError();
bInstallDriver=FALSE;
}
regKey.Close();
}
if(!bInstallDriver)
{
return -1;
}
CString strKeyValueName="Software\\ODBC\\ODBC.INI\\";
strKeyValueName+=strDSN;
lRet=regKey.Create(HKEY_LOCAL_MACHINE,strKeyValueName);
if(lRet!=ERROR_SUCCESS)
{
return -2;
}
regKey.SetValue(strDBName,"Database");
regKey.SetValue("SQLSrv32.dll","Driver");
regKey.SetValue(strDBServer,"Server");
regKey.SetValue(strUID,"LastUser");
regKey.m_hKey=HKEY_LOCAL_MACHINE;
regKey.SetKeyValue("Software\\ODBC\\ODBC.INI\\ODBC Data Sources","SQL Server",strDSN);
regKey.Close();
return 0;
}


回复
prettywolf 2002-05-10
可以直接修改注册表来完成:
用户DSN在注册表中的位置:HKEY_CURRENT_USER\Software\ODBC下的ODBC.INI
系统DSN在注册表中的们置:HKEY_LOCAL_MACHINE\Software\ODBC下的ODBC.INI

你可以先进行手动配置,在手动配置之前记录下注册表中的信息。
配置完成后再进行对比就能看出异同。
再在你的程序中修改注册表就行了。
回复
monkey_boy 2002-05-10
用SQLConfigDataSource函数实现,如:
SQLConfigDataSource(NULL,ODBC_ADD_DSN,"SQLServer","DSN=MyDSN\0DESCRIPTION=SQLConfigDSN Sample\0"
"SERVER=MySQL\0ADDRESS=Server\0NETWORK=dbmssocn\0"
"DATABASE=Northwind\0");
不太记得了,查一查MSDN吧!
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-05-10 04:07
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……