C++对MS SQL Server的操作
今天因为在做一份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的操作的更多相关文章
- .net core连接Liunx上MS SQL Server
场景 由于业务要求,需要对甲方的一个在SQL Server上的财务表进行插入操作.研究了半天,因为一个小问题折腾了很久. 过程 .net core端: 1. 利用EF,就需要的导入相关的Nuget包, ...
- MS SQL Server中数据表、视图、函数/方法、存储过程是否存在判断及创建
前言 在操作数据库的时候经常会用到判断数据表.视图.函数/方法.存储过程是否存在,若存在,则需要删除后再重新创建.以下是MS SQL Server中的示例代码. 数据表(Table) 创建数据表的时候 ...
- MS SQL Server 数据库分离-SQL语句
前言 今天在在清理数据库,是MS SQL Server,其中用到分离数据库文件.在这过程中,出现了一个小小的问题:误将数据库日志文件删除了,然后数据就打不开了,除了脱机,其他操作都报错. 数据库分离 ...
- 在易语言中调用MS SQL SERVER数据库存储过程方法总结
Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...
- (火炬)MS SQL Server数据库案例教程
(火炬)MS SQL Server数据库案例教程 创建数据库: CREATE DATABASE TDB //数据库名称 ON ( NAME=TDB_dat,//逻辑文件名 在创建数据库完成之后语句中引 ...
- (转载)MS SQL Server 未公开的加密函数有哪些?
MS SQL Server 未公开的加密函数有哪些? 以下的文章是对MS SQL Server 未公开的加密函数的具体操作,如果你对其相关的实际操作有兴趣的话,你就可以点击了. MS SQL Serv ...
- MS SQL Server时间常用函数
SQLServer时间日期函数详解,SQLServer,时间日期, 1. 当前系统日期.时间 select getdate() 2. dateadd 在向指定日期加上一段时间的基础 ...
- Oracle\MS SQL Server Update多表关联更新
原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...
- MS SQL Server 数据库连接字符串详解
MS SQL Server 数据库连接字符串详解 原地址:http://blog.csdn.net/jhhja/article/details/6096565 问题 : 超时时间已到.在从池中获取连接 ...
随机推荐
- ashx文件要使用Session
ashx文件要使用Session,必须实现Session接口; using System;using System.Web;using System.Web.SessionState; //第一步:导 ...
- 配置JDK和TOMCAT
配置JDK 1.先从官网下载最新的JDK安装包,然后安装.安装过程中会询问是否再装JRE,因为JDK中已经包含JRE,所以不必重复安装. 2.注意安装的路径名最好不要有中文或者空格出现. 3.在系统环 ...
- Javascript之动画1
我们来做一个小球运动的例子:在这个demo中,我们要求连续多次点击小球“开始”按钮,小球运动速度就越来越快.但是还是不完美存在BUG的,经过多次点击“开始”按钮再点击"停止"按钮就 ...
- 【转载】php程序员:从1.5K到18K 一个程序员的5年成长之路
昨天收到了心仪企业的口头offer, 回首当初什么都不会开始学编程, 到现在恰好五年. 整天在社区晃悠, 看了不少的总结, 在这个时间点, 我也写一份自己的总结吧. 我一直在社区分享, 所以, 这篇总 ...
- Winform实现鼠标可穿透的窗体镂空效果
今天找到一个名叫LICEcap的录屏软件,录制界面是这样的: 这个炫酷的空心窗口就是镜头,调整好大小,然后对准需要录制的地方按下Record就可以生成gif了. 卧槽太NB了我也要做一个! 根 ...
- UI布局
1,初始化控件一般在onCreate()中完成,由于构造器中尚未完成控件加载,不能在其内初始化控件. 2,Activity子类必须含有无参构造.Intent.startActivity()方法调用的是 ...
- 使用记事本+CSC编译程序
本次学习主要阐明.NET开发可以不使用VS,也能像Java一样使用命令窗口.但实际意义不大. 诸位看管不必太留意.(仅供留着给公司新人,树(tree)新(new)风(bee)用.) 1.新建一个文本文 ...
- WEB应用中的SESSION知多少?
作为一名WEB开发程序员,对session的理解是最基础的,但是现状是WEB程序员遍地都是,随便一划拉一大把,不过估计能把session能透彻理解的人应该不是很多,起码我之前对此是知之甚少,偶然看到的 ...
- 《DDNS服务器的搭建和案例解决方法》
DDNS原理:DNS + DHCP =DDNS DHCP负责ip解析,和分配给客户机ip,ip为随机数. DNS负责域名解析,A记录里记录了每个ip对应的域名. 客户端ip肯定是变化的,不可能一直使用 ...
- 《Apache服务用户身份验证管理》RHEL6.3
1.安装apache软件包 Yum install httpd 2.启动apache服务 /etc/init.d/httpd restart 3.创建一个目录,内编辑一个index.html文件 4. ...