今天因为在做一份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. php学习笔记3--php中获取时间与实际时间不符

    问题描述:在php脚本中使用date()获取服务器时间时总是与实际时间相差几个小时. 可能原因:php配置文件中时区的设置出现问题 解决方法: 方法1. php.ini文件中date.timezone ...

  2. 二十一、Android上常见度量单位【xdpi、hdpi、mdpi、ldpi】解读

    术语和概念 屏幕尺寸 屏幕的物理尺寸,以屏幕的对角线长度作为依据(比如 2.8寸, 3.5寸). 简而言之, Android把所有的屏幕尺寸简化为三大类:大,正常,和小. 程序可以针对这三种尺寸的屏幕 ...

  3. shell命令getopts解析

    getopts是一条获取和处理命令行选项的语句,格式为getopts option_string variable .其中option_string中包含一个有效的单字符选项,若getopts命令在命 ...

  4. Lambda表达式的本质是匿名函数

    1.委托的简介: 委托可以简单的理解为方法的列表,添加的方法的参数类型,个数,顺序必须和委托一致, 也就是说委托起到了托管方法的作用,并且约束了要调用的方法. //1声明委托 public deleg ...

  5. 【ASP.NET】获取网站目录的方法

         获取网站物理路径: HttpRuntime.AppDomainAppPath 获取网站虚拟路径: HttpRuntime.AppDomainAppVirtualPath

  6. tomcat之JNDI数据源配置

    一.docbase包含方式部署项目 D:\apache-tomcat-6.0.29\conf\server.xml里面添加如下内容   <Host name="localhost&qu ...

  7. JSP_EL使用

    JSP中EL表达式的简单介绍和使用   参考资料: http://www.java3z.com/cwbwebhome/article/article8/8124.html?id=2453   http ...

  8. WindowsPhone8 数据库增删改查

    今天第一次在博客园发表文章,如果有的地方写的不对,还请大家指出! 1.这就是一个简单wp8数据库增删改查 1.创建数据表Person [Table] public class Person : INo ...

  9. mysql mmm高可用架构设计

    项目概述:搭建主从,双主,安装Perl模块  安装配置mmm软件  测试 硬件环境:4台虚拟PC 软件环境:rehl6.5 MySQL-5.6.26 percona-xtrabackup-2.3.4 ...

  10. WCF 服务与终结点(四)

    服务 服务是一组公开功能的集合. 服务内部包含了如语言.技术.版本与框架等概念,服务之间的交互只允许使用规定的通信模式 外界客户端并不知道服务内部的实现细节,所以WCF服务通常通过元数据的方式描述可用 ...