MFC连接数据库问题

Anitee 2011-11-29 01:34:08
void CCSPTDlg::SetDbInfo()
{
CString m_hostname;
CString m_dbname;
CString m_username;
CString m_pwd;
GetDlgItem(IDC_HOSTNAME)->GetWindowText(m_hostname);
GetDlgItem(IDC_DATABASE)->GetWindowText(m_dbname);
GetDlgItem(IDC_USERNAME)->GetWindowText(m_username);
GetDlgItem(IDC_PWD)->GetWindowText(m_pwd);

CDatabase m_db;
CString dsn;

dsn.Format("Driver={SQL Server};Server=%s;DATABASE=%s;UID=%s;PWD=%s",m_hostname,m_dbname,m_username,m_pwd);
m_db.OpenEx( _T( "DSN=dsn" ),CDatabase::noOdbcDialog);

这是连接数据库的代码,不知道有什么问题吗?编译可以通过,但是运行时提示“未发现数据源名称并且未指定默认驱动程序”,请问是什么原因?怎么解决?谢谢!
...全文
256 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Anitee 2011-12-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 feidaosh 的回复:]

其实我是相当纠结,为啥"DSN=dsn"这样也能把dsn变量的值代进去呢?现在手头没VC,没法调试,感觉心里有只猫在挠挠。并不是怀疑你啥的,如果你也是做技术的,应该能理解我这种状态,这是一种对技术精益求精与锲而不舍的精神追求,对人生目的的迷茫与混沌中抓住唯一一丝不是黑白色的小红花瓣的希望,咳咳,好吧,走神走得太远了。。。。。。分神马的都是浮云
[/Quote]

呵呵,技术人就应该有这种精神。对了,如果是DSN="dsn",那就是dsn三个字符,但是如果DSN=dsn,就是dsn的值。
feidaosh 2011-12-15
  • 打赏
  • 举报
回复
其实我是相当纠结,为啥"DSN=dsn"这样也能把dsn变量的值代进去呢?现在手头没VC,没法调试,感觉心里有只猫在挠挠。并不是怀疑你啥的,如果你也是做技术的,应该能理解我这种状态,这是一种对技术精益求精与锲而不舍的精神追求,对人生目的的迷茫与混沌中抓住唯一一丝不是黑白色的小红花瓣的希望,咳咳,好吧,走神走得太远了。。。。。。分神马的都是浮云
feidaosh 2011-12-14
  • 打赏
  • 举报
回复
dsn.Format("Driver={SQL Server};Server=%s;DATABASE=%s;UID=%s;PWD=%s",m_hostname,m_dbname,m_username,m_pwd);
m_db.OpenEx( _T( "DSN=dsn" ),CDatabase::noOdbcDialog);

嗯,这位大姐,我好多年不用数据库了,而且以前用的时候也不用ODBC的。不过,俺觉得,你外面是有个变量叫dsn,但在这个连接字符串里,"DSN=dsn",这个字符串里的dsn会被当成变量处理吗?不是只是"dsn"三个字符吗?
我现在做工程方面的东西,机器上没有MSDN了,有些东西没法查,对这个连接字符串的印象也不深了,但这个地方。。。我觉得我还是对的。
另外,我创建连接连接字符串,都不是手动去写的。windows下,我一般都是创建一个文本文件,然后把后缀名改成".udl",然后双击这个文件,会出来microsoft的一个数据连接器,设置并测试好连接以后,这个文件会自动生成连接字符串,把它拷出来用就好了。这样的情况下一般这个连接字符串不会有问题。如果用到ODBC,你可能还要再去设置ODBC服务。
但在你这个例子中,当你不能确定是不是数据源有问题时,你就可以debug下,然后在OPEN的时候,把你的dsn变量中的连接字符串拷出来,拷到".udl"文件中去,这样就可以在".udl"文件中测试连接了。这样就一下子定位到是数据源连接的问题。
Anitee 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 feidaosh 的回复:]

姐姐,你把"DSN=dsn"有啥用。。。DSN要等于dsn这个字符串变量,不应该是"dsn"这三个字符吧。
[/Quote]


大哥,我dsn已经是变量,已经获得我需要的内容,并非dsn三个字符。
另外,问题已经解决,原因是没有写ODBC
feidaosh 2011-12-14
  • 打赏
  • 举报
回复
姐姐,你把"DSN=dsn"有啥用。。。DSN要等于dsn这个字符串变量,不应该是"dsn"这三个字符吧。
Anitee 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 feidaosh 的回复:]

dsn.Format("Driver={SQL Server};Server=%s;DATABASE=%s;UID=%s;PWD=%s",m_hostname,m_dbname,m_username,m_pwd);
m_db.OpenEx( _T( "DSN=dsn" ),CDatabase::noOdbcDialog);

嗯,这位大姐,我好多年不用数据库了,而且以前用的时候也不用ODB……
[/Quote]


首先很感谢你这么耐心的给我解释,而且也提供了一种比较好的方法。我单步调试了,确实是已经获得dsn的内容,而不是dsn三个字符。很抱歉,在你回复之前已经结贴,否则会把分给你的,抱歉!再次感谢。
ouyh12345 2011-11-29
  • 打赏
  • 举报
回复
在msdn上找CDatabase的sample
Anitee 2011-11-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ouyh12345 的回复:]

你传的是DSN=dsn这个字符串啊
dsn.Format("DSN=Driver={SQL Server};Server=%s;DATABASE=%s;UID=%s;PWD=%s",m_hostname,m_dbname,m_username,m_pwd);
[/Quote]

按你说的试了下,还是一样的错误。。。
ouyh12345 2011-11-29
  • 打赏
  • 举报
回复
你传的是DSN=dsn这个字符串啊
dsn.Format("DSN=Driver={SQL Server};Server=%s;DATABASE=%s;UID=%s;PWD=%s",m_hostname,m_dbname,m_username,m_pwd);
Anitee 2011-11-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]

m_db.OpenEx( _T( "DSN=dsn" ),CDatabase::noOdbcDialog);
也得Format吧,DSN=Driver={SQL Server};Server=%s;DATABASE=%s;UID=%s;PWD=%s
[/Quote]


说清楚点,我这样得到的dsn不是已经format了吗?
ouyh12345 2011-11-29
  • 打赏
  • 举报
回复
m_db.OpenEx( _T( "DSN=dsn" ),CDatabase::noOdbcDialog);
也得Format吧,DSN=Driver={SQL Server};Server=%s;DATABASE=%s;UID=%s;PWD=%s

65,187

社区成员

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

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