工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 3751|回复: 13

ADO连接的用户名和密码问题

[复制链接]
发表于 2008-6-22 03:46 | 显示全部楼层 |阅读模式
在用C++编写数据库系统时,我试图用ADO技术进行与SQL SERVER的连接。用ADO技术进行连接时,需要在连接字符串中写出用户名和密码。
       在我平时登陆SQL  SERVER时,是直接通过WINDOWS验证的,根本不需要输入用户名和密码。现在在程序中连接,需要用户名和密码,这可真把我难住了。因为我不知道我平常登陆时系统默认的用户名和密码是什么。
#include"stdio.h"
#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")
_ConnectionPtr m_pConnection;
int main(){
try{
      m_pConnection.CreateInstance("ADODB.Connection");
   _bstr_t strConnect="Provider=SQLOLEDB.1;Password=;Persist Security Info=True;User ID=;Initial Catalog=SC;Data Source=localhost;";
   m_pConnection->Open(strConnect,"","",adModeUnknown);
   if(m_pConnection->State==adStateOpen){
     printf("OK\n");
         while(getchar()=='\n');
   }//if
   else{
    printf("连接失败!\n");
    while(getchar()=='\n');
   }//else
   m_pConnection->Close();
   if(m_pConnection->State==adStateClosed){
    printf("已断开连接!\n");
          while(getchar()=='\n');
   }//if
}
catch(_com_error e){
  printf("出现异常!\n");
  while(getchar()=='\n');
}
printf("OK\n");
while(getchar()=='\n');
}

这是我进行连接实验时的代码。在连接字符串   _bstr_t strConnect="Provider=SQLOLEDB.1;Password=;Persist Security Info=True;User ID=;Initial Catalog=SC;Data Source=localhost;";中,无论USER ID和PASSWORD怎么改,运行结果都是输出“出现异常!”。根据我这程序的代码,这样的输出意味着根本没连上SQL  SERVER。
发表于 2008-6-22 09:52 | 显示全部楼层
sa和其密码 忘了的话在企业管理器里可以改
回复

使用道具 举报

 楼主| 发表于 2008-6-22 10:38 | 显示全部楼层
怎么改?
回复

使用道具 举报

发表于 2008-6-22 11:21 | 显示全部楼层
sql server组- >安全性- >登录
回复

使用道具 举报

 楼主| 发表于 2008-6-23 03:57 | 显示全部楼层
谢谢皇家救星!经过一天的奋斗,我终于成功连接数据库了。连接的代码是:
void Connect(){
        try{
          CoInitialize(NULL);
          _RecordsetPtr m_pRecordset(_uuidof(Recordset));
      _ConnectionPtr m_pConnection("ADODB.Connection");
          m_pConnection->Open("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=library;Data Source=YEQIJING","","",adConnectUnspecified);
          if(m_pConnection->State==adStateOpen){printf("Connect OK!\n"); return;}
          else {printf("Fail to connect the database!\n");return;}
        }//try
        catch(_com_error e){
         printf("Have execptions!\n");
        }//catch
}//Connect()

但是现在又遇到新麻烦了:这样连接的话可移植性很差啊!因为在我的连接字符串里,Data Source=YEQIJING,其中YEQIJING是服务器名称。
在自家电脑上,这样连接没有问题。但是当软件交给客户后,客户的服务器名称可不是YEQIJING了。那样的话,这个程序在运行时就会产生连接数据库的作用。究竟怎么样才能有好的可移植性呢?
回复

使用道具 举报

发表于 2008-6-23 08:04 | 显示全部楼层
(local)
回复

使用道具 举报

发表于 2008-6-23 08:05 | 显示全部楼层
或者把数据库源名写在配置文件里面
回复

使用道具 举报

 楼主| 发表于 2008-6-23 10:39 | 显示全部楼层
哪里改成local?我试过改Data Source=local,结果出现异常。
或者把数据库源名写在配置文件里面——也就是改哪一项呢?哪一项是配置文件?数据库源名又应该是一个什么样的名?
回复

使用道具 举报

发表于 2008-6-23 11:59 | 显示全部楼层
少了括号

配置文件:即将某些参数放在文件里面,程序启动时从里面获取参数

详细情况请搜索:VC 读取ini
回复

使用道具 举报

 楼主| 发表于 2008-6-23 14:30 | 显示全部楼层
改成这样还是异常

#import "c:\Program Files\Common Files\System\ado\msado15.dll"  no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")
#include"stdio.h"
#include"string.h"
_RecordsetPtr m_pRecordset;
_ConnectionPtr m_pConnection;

void Connect(){
        try{
      CoInitialize(NULL);
          m_pRecordset.CreateInstance(_uuidof(Recordset));
      m_pConnection.CreateInstance("ADODB.Connection");
          m_pConnection->Open("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=library;Data Source=(local)","","",adModeUnknown);
          if(m_pConnection->State==adStateOpen){printf("Connect OK!\n"); return;}
          else {printf("Fail to connect the database!\n");return;}
        }//try
        catch(_com_error e){
         printf("Have execptions!\n");
        }//catch
}//Connect()

void Disconnect(){
        m_pConnection->Close();
    if(m_pConnection->State==adStateClosed)
                printf("Disconnect OK!\n");
        else
                printf("Fail to disconnect!\n");
}//Disconnect()


int main(){
        Connect();
        _bstr_t vSQL;
        vSQL="SELECT * FROM CLERK";
    m_pRecordset->Open(vSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
        for(m_pRecordset->MoveFirst();!m_pRecordset->adoEOF;m_pRecordset->MoveNext()){
                char ID[20];
                char Name[20];
        strcpy(ID,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("CLERK_ID"));
                strcpy(Name,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("NAME"));
                printf("ID:%s NAME:%s\n",ID,Name);
        }//for()
        while(getchar()=='\n');
    Disconnect();
        while(getchar()=='\n');

}//main()
回复

使用道具 举报

 楼主| 发表于 2008-6-23 14:30 | 显示全部楼层
Data Source=后面似乎非要接YEQIJING不可。
回复

使用道具 举报

发表于 2008-6-23 23:18 | 显示全部楼层
那就搞成配置文件吧 把有可能变动的都写在配置文件里面 到时到别人机上改一下配置文件就行 exe文件不用动 现在很多软件都是这样搞 听说以后的趋向是用xml代替ini
回复

使用道具 举报

发表于 2008-6-23 23:19 | 显示全部楼层
在我和同学机上都有(local)这个服务器名 我们都是装的sql2000 不知道为何你的没有
回复

使用道具 举报

 楼主| 发表于 2008-6-24 02:54 | 显示全部楼层
我是SQL SERVER2005
我后来用STRCAT函数OK了。其中服务器名需要用户自己输入。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-5-9 16:14

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表