标题:求教C++连接数据库的方法
只看楼主
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
得分:0 
//把你调试出错的地方象下面用try catch包起来试试,看看有什么提示。
    try
    {
        m_pConnection->Open(strConnect, "", "", adModeUnknown);
    }
    catch(_com_error &e)
    {
            _bstr_t bstrSource(e.Source());  
            _bstr_t bstrDescription(e.Description());  
  
            printf("Error\n");  
            printf("\tCode = %08lx\n", e.Error());  
            printf("\tCode meaning = %s\n", e.ErrorMessage());  
            printf("\tSource = %s\n", (LPCSTR) bstrSource);  
            printf("\tDescription = %s\n", (LPCSTR)bstrDescription);  
    }
2015-12-21 10:45
日寂
Rank: 2
等 级:论坛游民
帖 子:37
专家分:15
注 册:2013-11-1
得分:0 
回复 11楼 newdos
Error
Code = 800a0e79
Code meaning = Unknown error 0x800AOE79
Source = ADODB.Connection
Description = 对象打开时,不允许操作

不允许操作……是说我连接数据库使用的账号有问题吗?

有妹故吾在。
2015-12-21 16:22
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
得分:0 
大致是你提供的链接字符串有问题吧,如果密码账户木有问题的话,多半是server那个地方有问题,服务器那里一般填ip地址,或是点.来替代本机sql服务。你可以试试。记得一般这个字符串可以在odbc配置测试连接那个对话框时会显示,直接复制到自己程序里就行了,反正俺的印象中server=这里不会是“我的电脑“这种字符串。很久没用微软的sql了,有版权的东西。

[此贴子已经被作者于2015-12-21 17:14编辑过]

2015-12-21 16:58
日寂
Rank: 2
等 级:论坛游民
帖 子:37
专家分:15
注 册:2013-11-1
得分:0 
回复 13楼 newdos
我以为server=PC名……
请问用点.来代替是把server=<...>整个替换成'.'还是server=.呢?

有妹故吾在。
2015-12-21 17:58
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
得分:0 
以下是引用日寂在2015-12-21 17:58:55的发言:

我以为server=PC名……
请问用点.来代替是把server=<...>整个替换成'.'还是server=.呢?


server=.
server=127.0.0.1   貌似本机ip地址是这种样子,意思都一样。确保链接的数据库是Student存在,一般都可以连通。自己试试吧.  ado好像都过时了,被取代了。。那种代码并不通用。

[此贴子已经被作者于2015-12-21 18:14编辑过]

2015-12-21 18:10
日寂
Rank: 2
等 级:论坛游民
帖 子:37
专家分:15
注 册:2013-11-1
得分:0 
回复 15楼 newdos
还是不行,同样的错误信息……
数据库Student确保存在

有妹故吾在。
2015-12-21 19:31
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
回复 16楼 日寂
你可以先在本机建立一个sql server的odbc链接,以确定本机sql server可用。

能编个毛线衣吗?
2015-12-21 19:43
日寂
Rank: 2
等 级:论坛游民
帖 子:37
专家分:15
注 册:2013-11-1
得分:0 
回复 17楼 wmf2014
是说“管理工具”的 “ODBC数据源”吗?如果是的话我使用的Student数据库已经添加成功了

有妹故吾在。
2015-12-21 21:35
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
得分:0 
明天测试一下ado连mdb,vs过期不能用了,无法测试sql,等版主测试吧.。不行就用odbc连接。

mdb测试结果:

#include <stdio.h>
#include <assert.h>
#include <tchar.h>

// TODO: 在此处引用程序需要的其他头文件
#import "c:\program files\common files\system\ole db\oledb32.dll" no_namespace
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")

void main()
{
    IDataSourceLocatorPtr Idslp = NULL;
    _ConnectionPtr ado_conn = NULL;
    _RecordsetPtr  ado_rs = NULL;
   
    ::CoInitialize(NULL);
   
    Idslp.CreateInstance(__uuidof(DataLinks));
    ado_conn = Idslp->PromptNew(); //弹出数据库源选择对话框
   
    if(ado_conn != NULL){
        
        printf("ConnectString : %s\n", (char *)ado_conn->ConnectionString); //输出连结字符串
    }
   
    try{
        HRESULT hr = ado_conn->Open("", "", "", -1);
        if(SUCCEEDED(hr))
            printf("open successful\n");
        
        ado_rs.CreateInstance(__uuidof(Recordset));
        ado_rs->Open("SELECT * FROM student",ado_conn.GetInterfacePtr(),
            adOpenDynamic,adLockOptimistic,adCmdText);

        _variant_t Holder;
        while(!ado_rs->adoEOF)
        {
            Holder = ado_rs->GetCollect("pass"); //查询字段
            if(Holder.vt!=VT_NULL)
                printf("%s\n",(char*)_bstr_t(Holder));
            ado_rs->MoveNext();
        }
    }
    catch(_com_error &e)
    {
        _bstr_t bstrDescription(e.Description());
        printf("\tDescription = %s\n", (LPCSTR)bstrDescription);
    }
   
    ado_rs.Release();
    if(ado_conn->State) ado_conn->Close();
    ado_conn.Release();
    Idslp.Release();
   
    ::CoUninitialize();
}

-------------------------------------------------------------------------
ConnectString : Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\VC6_prg\test12\m
ydb.mdb;Persist Security Info=False
open successful
123
456
是你
Press any key to continue

可以联结上,并自动显示连结字符串,你根据弹出的选择数据源框进行SQL连结测试,完了就会出现不同的字符串。拷下来就好了。

不过vs编译会出现4192警告,解释办法查msdn, Com代码看着很蛋疼。

[此贴子已经被作者于2015-12-22 13:09编辑过]

2015-12-21 22:27
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
这是我在网络里找到的一段言论  我觉得他可能是对的  因为我用第二种方式 连接成功(第一种 死机  第三种没有测试  我的sql登陆方式属于第二种)

程序代码:
一、连接SQL SERVER的第一种连接字串:
是针对数据库身份验证模式为”SQL SERVER 和 windows“而言,
连接字串为:
CString strConn;
strConn = ”Provider = SQLOLEDB.1;\
Persist Security Info = true;\
User ID = sa;\
Password=123456;\
Initial Catalog = tempdb;\
Data Source = 127.0.0.1”;
(包含 6 项,有用户名和密码,数据库名,服务器名(服务器名可以是网络上的,此时是一个IP地址))

二、连接SQL SERVER的第二种连接字串:
针对身份验证模式为“仅 windows”,
连接字串为:
strConn= “
Provider = SQLOLEDB.1;\
Integrated Security=SSPI;\
Persist Security Info =false;\
Initial Catalog = tempdb;\
Data Source = (local)”;
(包含 5 项,因为已经有windows验证了,所以不再需要用户名和密码,如果是本机的SQL SERVER,那么服务器名可写为(local))

三、连接SQL SERVER的第三种连接字串:
仅针对ODBC的连接方式,
连接字串为:
strConn= “
Provider = SQLOLEDB;\
Server = (local);\
Database = tempdb;\
uid = sa;\
pwd=12345;"



附上我的成功代码 : xp+sp3  vs2010  sql2005  测试成功

程序代码:
#include <stdio.h> 
#include <windows.h>
#include <string.h>

#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")   //引入ADO库

int main(void)
{
    _ConnectionPtr m_pConnection=NULL;
    CoInitialize(NULL);  //初始化com库
    HRESULT hr = m_pConnection.CreateInstance("ADODB.Connection");    //创建Connection对象
    if(SUCCEEDED(hr))  //创建数据库connection对象成功
    {
        _bstr_t strConnect = "Provider = SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info =false;Initial Catalog = student;Data Source = (local)";
        hr = m_pConnection->Open(strConnect,"","",adModeUnknown);
        if(SUCCEEDED(hr))   //连接数据库字符串成功
        {
            _RecordsetPtr MySet;
            MySet.CreateInstance(__uuidof(Recordset));
            MySet->Open("SELECT * FROM base",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
            _variant_t Holder;
            while(!MySet->adoEOF)
            {
                Holder = MySet->GetCollect("xm");
                if(Holder.vt!=VT_NULL)
                    printf("%s\n",(char*)_bstr_t(Holder));
                MySet->MoveNext();
            }
        }
    }
    return 0;
}


[此贴子已经被作者于2015-12-22 13:52编辑过]

收到的鲜花
  • 日寂2015-12-22 16:21 送鲜花  1朵   附言:我很赞同
  • 日寂2015-12-22 16:21 送鲜花  5朵   附言:我很赞同

DO IT YOURSELF !
2015-12-22 13:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-460171-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.351035 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved