今天因为在做一份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. 如何防止Android应用代码被窃

    上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...

  2. PropertyGrid排序

    解决PropertyGrid对自定义属性排序的问题. 参考了:http://www.cnblogs.com/greatverve/archive/2012/02/08/propergrid-order ...

  3. UI5_UINavigation传值

    // // AppDelegate.m // UI5_UINavigation传值 // // Created by zhangxueming on 15/7/7. // Copyright (c) ...

  4. MATLAB 生成 COM 步骤

    环境: 操作系统:windows xp sp3 MATLAB:Version 7.1.0.246(R14) Service Pack 3 第一步:安装编译器(如果已经安装则可跳过此步) 在MATLAB ...

  5. 杭电ACM2091--空心三角形

    http://acm.hdu.edu.cn/showproblem.php?pid=2091 scanf 和 printf的输入输出功能并不强大.有时候我们需要清空输入输出流,所以一定切记getcha ...

  6. NOIP 2015普及组复赛Day1 T1 == Codevs4510 神奇的幻方

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold  题目描述 Description: 幻方是一种很神奇的N∗N矩阵:它由数字 1,2,3, … … ,N∗N构成, ...

  7. 关于java的转义字符

    关于java的转义字符 我们都知道  String s="ad,dfjdlfs,df,s,dfl";              执行 String re[]=s.split(&qu ...

  8. fpm打包redis3.0.7

    1.安装redis tar -xf redis-3.0.7.tar.gz -C /usr/local cd /usr/local && mv redis-3.0.7 redis cd ...

  9. 20130909QA整理笔记

    做项目里遇到的一些问题!! 1.滚动条样式 webkit可以使用css来调节滚动条样式: http://www.cnblogs.com/rubylouvre/archive/2011/03/01/19 ...

  10. 【转】IL编织 借助PostSharp程序集实现AOP

    ref:   C# AOP实现方法拦截器 在写程序的时候,很多方法都加了.日志信息.比如打印方法开始,方法结束,错误信息,等等. 由于辅助性功能的代码几乎是完全相同的,这样就会令同样的代码在各个函数中 ...