今天因为在做一份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. apache Internal Server Error 的几个问题

    Internal Server Error The server encountered an internal error or misconfiguration and was unable to ...

  2. Javascript加载速度慢解决办法

    通常我们的网站里面会加载一些js代码,统计啊,google广告啊,百度同盟啊,阿里妈妈广告代码啊,一堆,最后弄得页面加载速度很慢,很慢.解决办法:换一个js包含的方式,让javascript加载速度倍 ...

  3. 桌面虚拟化之XenDesktop7

    安装篇 1. 安装所需要的组件 2. 安装核心组件 配置篇 完整的部署 1. 打开Citrix Studio软件 2. 选择完整部署 3. 创建站点 4. 选择数据库(可以使用自己的或者默认使用自带的 ...

  4. 【学习笔记】【C语言】进制

    1. 什么是进制 是一种计数的方式,数值的表示形式 2. 二进制 1> 特点:只有0和1,逢2进1 2> 书写格式:0b或者0b开头 3> 使用场合:二进制指令\二进制文件,变量在内 ...

  5. 3DES 加解密,对长度不限制

    #region 3DES /// <summary> /// 3DES加密 /// </summary> /// <param name="strString& ...

  6. 【转载】#323 - A Generic Class is a Template for a Class

    A generic classs is a class that takes one or more type parameters, which it then uses in the defini ...

  7. SP避免Form重复提交的三种方案

    SP避免Form重复提交的三种方案  1) javascript ,设置一个变量,只允许提交一次.   <script language="javascript">  ...

  8. java基础-注解Annotation原理和用法

    在很多java代码中都可以看到诸如@Override.@Deprecated.@SuppressWarnings这样的字符,这些就是注解Annotation.注解最早在jdk5中被引入,现在已经成为j ...

  9. 验证中文、英文、电话、手机、邮箱、数字、数字和字母、Url地址和Ip地址的正则表达式

    Helper类代码 public class Helper { #region 单列循环 private Helper() { } private static Helper instance = n ...

  10. 【转】你需要知道的Python用法

    在使用Python多年以后,我偶然发现了一些我们过去不知道的功能和特性.一些可以说是非常有用,但却没有充分利用.考虑到这一点,我编辑了一些的你应该了解的Pyghon功能特色. 带任意数量参数的函数 你 ...