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 问题 : 超时时间已到.在从池中获取连接 ...
随机推荐
- GitHub之创建
O(∩_∩)O~ 爱“搞事”的我又创了一个Github账号,和当初加入博客园的初衷一样,为了广泛交流和学习而已.很久之前我就发现了有很多人都在使用GitHub,然而当时看不懂英文(绝大部分都是英文), ...
- shell获取本地ip的三种方法
第一种方法:ifconfig|grep inet |awk '{print $2}'|sed '2d'|awk -F : '{print $2}'第二种方法:ifconfig|grep inet|se ...
- iOS 高阶
1.UIStoryBoard 2. segue跳转传值 3. UIColor配色 //1. 十进制配色 [UIColor colorWithRed:163.0/255.0 green:148.0/25 ...
- 2014028-jQuery与正则表达式[转]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- (转)RabbitMQ消息队列(二):”Hello, World“
本文将使用Python(pika 0.9.8)实现从Producer到Consumer传递数据”Hello, World“. 首先复习一下上篇所学:RabbitMQ实现了AMQP定义的消息队列.它实现 ...
- 微信公众号与HTML 5混合模式揭秘1——如何部署JSSDK
本文是连载JSSDK+H5的书,这里是第一篇揭秘————如何部署JSSDK 部署JSSDK不会太难,有时候需要一点后台知识,但也不是太难的那种,本节主要是用PHP作为后台参考语言,为了照顾初学者,把代 ...
- call与apply函数
call与apply函数 1.为什么需要call与apply函数 Javascript中,每一个函数内部都有一个特殊的关键词this,其随着所处环境的不同其指向也是不同的. 函数的内部其this也是指 ...
- cass实体编码列表
地物名称 编码 图层 类别 参数一 参数二 实体类型 三角点 131100 KZD 20 gc113 3 SPECIAL,1 三角点分数线 131110 KZD 附 LINE 三角点高程注记 1311 ...
- copy con
在DOS系统中,一些计算机设备也有文件名,叫做设备文件,可以用对应的文件名来操作它.后来的WINDOWS也保留了这些设备文件.比如con表示console(控制台,简单的说就是键盘和屏幕),com ...
- bzoj 1006: [HNOI2008]神奇的国度
这是个标准的弦图,但如果不知道弦图就惨了=_= 趁着这个机会了解了一下弦图,主要就是完美消除序列,求出了这个就可以根据序列进行贪心染色. 貌似这个序列很神,但是具体应用不了解…… 这道题为什么可以这么 ...