今天因为在做一份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. CS对于dll文件的引用

    1.对于.net或者com型的组件,直接添加引用即可. 2.对于标准的dll文件,利用DLLImport这个函数即可,如果要使用函数的别名,那么应该加入EntryPoint. 示例:一般可以封装成一个 ...

  2. iOS UIView简单缩放动画

    @interface ViewController () { UIView *animationView; UIButton *button; CGPoint animationPoint; } @e ...

  3. 【原创】Tomcat集群环境下对session进行外部缓存的方法(1)

    BJJC网改版, 计划将应用部署在tomcat集群上,集群的部署方案为Apache+Tomcat6,连接件为mod_jk,其中开启了session复制和粘性session.计划节点数为3个. 到这,或 ...

  4. iOS 数据模型 的 一般设计

  5. db.properties 数据库配置文件

    project.pool.initialPoolSize project.pool.minPoolSize project.pool.maxPoolSize project.db.tablePrefi ...

  6. 纪念一下自己的第一篇cnblog

    2016-08-1016:33:22 // Netease.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iost ...

  7. 【风马一族_Android】Android 从命令行界面获取手机信息

    Android 从命令行界面获取手机信息 1: cmd 打开命令行界面 2:adb devices   获取与电脑相连的设备,例如:模拟器.真机(手机) (右击“标记”,选择设备名称,点击“Ctrl+ ...

  8. php 去除数组中重复元素

    去除数组中重复元素, 找了下可以一下两个函数 php array_flip()与array_uniqure() $arr = array(…………) ;// 假设有数组包含一万个元素,里面有重复的元素 ...

  9. Git的学习总结和使用时遇到的问题。

                        git 是一款非常强大的版本控制工具,现在市场占有率应该是一家独大了,以前用svn的童鞋估计都转投git阵营了吧   加上很多公司也用git管理自己的项目,所以 ...

  10. AJAX 跨域 :Access-Control-Allow-Origin

    在一个项目上想用NodeJS,在前端的JS(http://localhost/xxx)中ajax访问后端RestAPI(http://localhost:3000/….)时(Chrome)报错: XM ...