今天因为在做一份C++的期末作业,突然想用C++来链接数据库,实现数据的重复利用,所以就作死去百度搜了一下。

更巧的事情是,一搜居然还有很多搜索结果,然后就照着做了。

做的过程很艰辛,就不一一诉说了,就简单说两句,C++的类名很奇怪,然后就是参数名啥的非常奇怪,也没有相应的参数说明,什么参数啥的完全不懂。

然后就是慢慢的做,在类型转换和数据操作上废了点时间,其他的还好,就不多说了,直接上代码,因为注释很详细清楚。

不过,在看我的乱的要死的代码之前,建议先看看大神的代码。

第一份是遍历一个表的代码:

http://www.cnblogs.com/ha666/archive/2013/06/12/3133348.html

第二份是介绍详细的链接和代码编写:

http://blog.csdn.net/ljh56789/article/details/8061323

第三份的亮点在于介绍参数,我的代码就是基本仿照第三份改的

http://blog.csdn.net/zhangyulin54321/article/details/8056580

下面就是我的代码了,很丑别嫌弃

#pragma once
#include <icrsint.h>
#include<iostream>
#include<iomanip>
#include <string>
using namespace std;
#import "c:\program files\common files\system\ado\msado15.dll"  no_namespace rename("EOF", "adoEOF")

int funeach()
{
    CoInitialize(NULL);        //这一步十分重要,没有这一步,将连不上服务器
    _ConnectionPtr  sqlSp;
    if (FAILED(sqlSp.CreateInstance(_uuidof(Connection))))
    {
        cout << "_ConnectionPtr对象指针实例化失败!!!" << endl;
        ;
    }
    else
    {
        try
        {
            //设置连接字符串
            _bstr_t strConnect = "Driver={sql server};server=127.0.0.1,1433;uid=sa;pwd=**********;database=homework;";
            sqlSp->Open(strConnect, "", "", adModeUnknown);

        }
        catch (_com_error &e) {
            cout << e.Description() << endl;

        }
        _RecordsetPtr m_pRecordset;
        if (FAILED(m_pRecordset.CreateInstance(_uuidof(Recordset))))
        {
            cout << "记录集对象指针实例化失败!" << endl;
            ;
        }
        try
        {
            //打开T_Member表
            m_pRecordset->Open("select * from  T_Member", (IDispatch*)sqlSp, adOpenDynamic, adLockOptimistic, adCmdText);

        }
        catch (_com_error &e)
        {
            cout << e.Description() << endl;
        }

        //查询数据
        try
        {
            m_pRecordset->MoveFirst();
            while (!m_pRecordset->adoEOF)
            {
                //遍历输出name列的值
                string name = (char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("name"))->Value);
                cout << name << endl;
                m_pRecordset->MoveNext();
            }

        }
        catch (_com_error &e)
        {
            cout << e.Description() << endl;
        }

        m_pRecordset->Close();
        m_pRecordset = NULL;
        sqlSp->Close();
        sqlSp = NULL;
    }
}

int funselect()
{
    CoInitialize(NULL);
    _ConnectionPtr m_pConnection;
    _RecordsetPtr m_pRecordset;
    try
    {
        if (FAILED(m_pConnection.CreateInstance(__uuidof(Connection))))
        {
            cout << "_ConnectionPtr对象指针实例化失败!!!" << endl;
            ;
        }
        m_pConnection->Open("Provider=SQLOLEDB;Server=127.0.0.1;Database=homework;uid=sa; pwd=**********;", "", "", adModeUnknown);
    }
    catch (_com_error e)
    {
        cout << "连接数据库失败!错误信息:" << e.ErrorMessage() << endl;
        system("pause");
        ;
    }

    try
    {
        if (FAILED(m_pRecordset.CreateInstance(_uuidof(Recordset))))
        {
            cout << "记录集对象指针实例化失败!" << endl;
            ;
        }
        m_pRecordset->Open(_variant_t("select Id, name from T_Member where name='123'"), _variant_t((IDispatch*)m_pConnection), adOpenKeyset, adLockOptimistic, adCmdText);
    }
    catch (_com_error &e)
    {
        cout << "处理失败1!错误信息:" << e.ErrorMessage() << endl;
        system("pause");
        ;
    }

    _variant_t vEmployeeID, vFirstName, vLastName, vHireDate, vCity;

    try
    {
        while (!m_pRecordset->adoEOF)
        {
            vEmployeeID = m_pRecordset->GetCollect(_variant_t(());//取得第1列的值,从0开始计数,你也可以直接列出列的名称,如下一行
            vFirstName = m_pRecordset->GetCollect("Id");
            vLastName = m_pRecordset->GetCollect("name");

            //取值
            string name = (char*)(_bstr_t)m_pRecordset->GetFields()->GetItem("name")->Value;
            cout << name;
            m_pRecordset->MoveNext();

        }
    }
    catch (_com_error &e)
    {
        cout << "处理失败2!错误信息:" << e.ErrorMessage() << endl;
        system("pause");
        ;
    }
    m_pRecordset->Close();
    m_pRecordset = NULL;
    m_pConnection->Close();
    m_pConnection = NULL;
}

int funupdate()
{
    CoInitialize(NULL);
    _ConnectionPtr m_pConnection;
    _RecordsetPtr m_pRecordset;

    try
    {
        m_pConnection.CreateInstance(__uuidof(Connection));
        if (FAILED(m_pConnection.CreateInstance(__uuidof(Connection))))
        {
            cout << "_ConnectionPtr对象指针实例化失败!!!" << endl;
            ;
        }
        m_pConnection->Open("Provider=SQLOLEDB;Server=127.0.0.1;Database=homework;uid=sa; pwd=**********;", "", "", adModeUnknown);
    }
    catch (_com_error e)
    {
        cout << "连接数据库失败!错误信息:" << e.ErrorMessage();
        system("pause");
        ;
    }

    try
    {
        m_pRecordset.CreateInstance(__uuidof(Recordset));
        if (FAILED(m_pRecordset.CreateInstance(_uuidof(Recordset))))
        {
            cout << "记录集对象指针实例化失败!" << endl;
            ;
        }
        m_pRecordset->Open("select Id,name from T_Member where name='123'", _variant_t((IDispatch*)m_pConnection), adOpenDynamic, adLockOptimistic, adCmdText);
    }
    catch (_com_error &e)
    {
        cout << "处理失败1!错误信息:" << e.ErrorMessage();
        system("pause");
        ;
    }

    try
    {
        while ((!m_pRecordset->adoEOF) && m_pRecordset != NULL)
        {
            m_pRecordset->PutCollect("));
            m_pRecordset->MoveNext();
            HRESULT m = m_pRecordset->Update();
        }
    }
    catch (_com_error &e)
    {
        //此处屏蔽了一个错误,但是也阻止了其他错误的处理
        /*cout << "处理失败2!错误信息:" << e.ErrorMessage();
        system("pause");
        return 0;*/
    }

    m_pRecordset->Close();
    m_pRecordset = NULL;
    m_pConnection->Close();
    m_pConnection = NULL;
}

int funadd()
{
    CoInitialize(NULL);
    _ConnectionPtr m_pConnection;
    _RecordsetPtr m_pRecordset;

    try
    {
        m_pConnection.CreateInstance(__uuidof(Connection));
        if (FAILED(m_pConnection.CreateInstance(__uuidof(Connection))))
        {
            cout << "_ConnectionPtr对象指针实例化失败!!!" << endl;
            ;
        }
        m_pConnection->Open("Provider=SQLOLEDB;Server=127.0.0.1;Database=homework;uid=sa; pwd=**********;", "", "", adModeUnknown);
    }
    catch (_com_error e)
    {
        cout << "连接数据库失败!错误信息:" << e.ErrorMessage();
        system("pause");
        ;
    }

    try
    {
        m_pRecordset.CreateInstance(__uuidof(Recordset));
        if (FAILED(m_pRecordset.CreateInstance(_uuidof(Recordset))))
        {
            cout << "记录集对象指针实例化失败!" << endl;
            ;
        }
        m_pRecordset->Open("select Id,name from T_Member", _variant_t((IDispatch*)m_pConnection), adOpenDynamic, adLockOptimistic, adCmdText);
    }
    catch (_com_error &e)
    {
        cout << "处理失败1!错误信息:" << e.ErrorMessage();
        system("pause");
        ;
    }

    try
    {
        m_pRecordset->MoveLast();
        m_pRecordset->AddNew();
        m_pRecordset->PutCollect("name", _variant_t("dudeping"));
        m_pRecordset->Update();
    }
    catch (_com_error &e)
    {
        cout << "处理失败2!错误信息:" << e.ErrorMessage();
        system("pause");
        ;
    }

    m_pRecordset->Close();
    m_pRecordset = NULL;
    m_pConnection->Close();
    m_pConnection = NULL;
}

int fundelet()
{
    CoInitialize(NULL);
    _ConnectionPtr m_pConnection;
    _RecordsetPtr m_pRecordset;

    try
    {
        if (FAILED(m_pConnection.CreateInstance(__uuidof(Connection))))
        {
            cout << "_ConnectionPtr对象指针实例化失败!!!" << endl;
            ;
        }
        m_pConnection->Open("Provider=SQLOLEDB;Server=127.0.0.1;Database=homework;uid=sa; pwd=**********;", "", "", adModeUnknown);
    }
    catch (_com_error e)
    {
        cout << "连接数据库失败!错误信息:" << e.ErrorMessage();
        system("pause");
        ;
    }

    try
    {
        m_pRecordset.CreateInstance(__uuidof(Recordset));
        if (FAILED(m_pRecordset.CreateInstance(_uuidof(Recordset))))
        {
            cout << "记录集对象指针实例化失败!" << endl;
            ;
        }
        m_pRecordset->Open("select Id,name from T_Member where name='456'", _variant_t((IDispatch*)m_pConnection), adOpenDynamic, adLockOptimistic, adCmdText);
    }
    catch (_com_error &e)
    {
        cout << "处理失败1!错误信息:" << e.ErrorMessage();
        system("pause");
        ;
    }

    try
    {
        if (m_pRecordset != NULL && (!m_pRecordset->adoEOF))
        {
            m_pRecordset->MoveFirst();
            m_pRecordset->Delete(adAffectCurrent);
            //参数adAffectCurrent为删除当前记录
            m_pRecordset->Update();
        }
    }
    catch (_com_error &e)
    {
        cout << "处理失败2!错误信息:" << e.ErrorMessage();
        system("pause");
        ;
    }

    m_pRecordset->Close();
    m_pRecordset = NULL;
    m_pConnection->Close();
    m_pConnection = NULL;
}

当然,这是开始的函数雏形,但是可以实现访问数据库并进行相应的操作,可以进一步封装成类,再对外开放接口,将数据库链接字符串和sql语句等传进去。

C++对MS SQL Server的操作的更多相关文章

  1. .net core连接Liunx上MS SQL Server

    场景 由于业务要求,需要对甲方的一个在SQL Server上的财务表进行插入操作.研究了半天,因为一个小问题折腾了很久. 过程 .net core端: 1. 利用EF,就需要的导入相关的Nuget包, ...

  2. MS SQL Server中数据表、视图、函数/方法、存储过程是否存在判断及创建

    前言 在操作数据库的时候经常会用到判断数据表.视图.函数/方法.存储过程是否存在,若存在,则需要删除后再重新创建.以下是MS SQL Server中的示例代码. 数据表(Table) 创建数据表的时候 ...

  3. MS SQL Server 数据库分离-SQL语句

    前言 今天在在清理数据库,是MS SQL Server,其中用到分离数据库文件.在这过程中,出现了一个小小的问题:误将数据库日志文件删除了,然后数据就打不开了,除了脱机,其他操作都报错. 数据库分离 ...

  4. 在易语言中调用MS SQL SERVER数据库存储过程方法总结

    Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...

  5. (火炬)MS SQL Server数据库案例教程

    (火炬)MS SQL Server数据库案例教程 创建数据库: CREATE DATABASE TDB //数据库名称 ON ( NAME=TDB_dat,//逻辑文件名 在创建数据库完成之后语句中引 ...

  6. (转载)MS SQL Server 未公开的加密函数有哪些?

    MS SQL Server 未公开的加密函数有哪些? 以下的文章是对MS SQL Server 未公开的加密函数的具体操作,如果你对其相关的实际操作有兴趣的话,你就可以点击了. MS SQL Serv ...

  7. MS SQL Server时间常用函数

    SQLServer时间日期函数详解,SQLServer,时间日期, 1.      当前系统日期.时间 select getdate() 2. dateadd      在向指定日期加上一段时间的基础 ...

  8. Oracle\MS SQL Server Update多表关联更新

    原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...

  9. MS SQL Server 数据库连接字符串详解

    MS SQL Server 数据库连接字符串详解 原地址:http://blog.csdn.net/jhhja/article/details/6096565 问题 : 超时时间已到.在从池中获取连接 ...

随机推荐

  1. linux 用户打开进程数和文件数调整

    1 查看nproc(max user processes)命令 [root@vm-cdh4 ~]# ulimit -u 14866 2 修改nproc 临时修改, 重登录或重启后失效: [root@v ...

  2. SQL SERVER 2008 R2 错误代码 17000 - 17999

    错误 严重性 是否记录事件 说明(消息正文) 17000 10 否 用法: sp_autostats <table_name> [, {ON|OFF} [, <index_name& ...

  3. Oracle中建立物化视图报错

    Oracle中建立物化视图报错 今天在建立视图的时候,报了一个错:ORA-01723: zero-length columns are not allowed. 建视图的语句: create mate ...

  4. iOS - UIView操作(SWift)

    1. UIView 视图的渐变填充 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after ...

  5. (转)分布式缓存GemFire架构介绍

    1什么是GemFire GemFire是一个位于应用集群和后端数据源之间的高性能.分布式的操作数据(operational data)管理基础架构.它提供了低延迟.高吞吐量的数据共享和事件分发.Gem ...

  6. OSI参考模型

    1.物理层:发送和接收比特.(工作在物理层的集线器) 2.数据链路层:提供数据的物理传输,并处理错误通知.网络拓扑和流浪控制, 数据链路层将报文封装成数据帧,并添加定制的报头,其中包括目标硬件地址, ...

  7. js 函数的调用模式

    1.函数调用 调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数.除了函数声明时定义的形参,每个函数还接受两个附加的参数:this和arguments(arguments并不是一个真正的数组, ...

  8. 【笔记】Windows Phone 8开发笔记之API

    Windows Phone 8 API一览 Windows Phone 7平台不支持Native语言的开发,这困扰了许多游戏和底层应用的开发者.Windows Phone 8 SDK的推出,改善了这个 ...

  9. shiro错误No SecurityManager accessible to the calling code

    Shire在Web.xml中shiroFilter的Mapping配置错误 org.apache.shiro.UnavailableSecurityManagerException: No Secur ...

  10. 在 linux x86-32 模式下分析内存映射流程

    前言 虚拟内存机制已经成为了现代操作系统所不可缺少的一部分, 不仅可以为每个程序提供独立的地址空间保证安全性,更可以通过和磁盘的内存交换来提高内存的使用效率.虚拟内存管理作为linux 上的重要组成部 ...