初学SQL--c++ SQL SERVER 数据库读写
代码都是网上一些大神写好的,汇总一下,形成一个从原理到应用的完整的流程,对于初学数据库的人有一定的借鉴意义。
一:背景知识:
(1)ODBC(Open Database Connectivity)即开放数据库互连,提供一组对数据库访问的标准API(应用程序接口),而且其本身也提供对SQL语言的支持,他的理念是能够提供“桥”让用户连接各种不同的数据源,用户通过其提供的接口就可以访问数据库了、
(2)ADO(ActiveX Data Objects)是一种程序对象,用于表示用户数据库中的数据结构和所包含的数据,可通过ADO对象和ADO的附加组件来创建或者修改表和查询、检验数据库或者访问外部数据源,还可以在代码中使用ADO来操作数据库中的数据。
ADO的对象和说明:
ADO接口:
(3)OLEDB是承认你关系与数据源进行交互的DLL,可以连接各种数据源,包括SQL SERVER、ORACLE、ACCESS、活动目录等等。
二:环境:VS2010 , SQL SERVER 2012
1:控制面板-管理工具-数据源(ODBC)-系统DSN-添加-选择SQL Server-任意命名和描述,选择本机服务器-(如:XXX-PC)
--使用用户输入登录ID和密码的SQL Server的访问,登录ID和密码都必须有,一般为sa,sa-然后选择更改默认的数据库为-(选择你使用的数据库)
点击完成--测试一下,能通过就可以了。
2:在SQL 2012中新建立一个数据库student,并创建一个表stu_info ,字段和取值如下:
3:打开VS2010,新建控制台程序,创建工程的时候记得加预编译头。
4:代码如下:
// SQLRead.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
#include "iomanip"
#include "windows.h"
using namespace std;
#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","EndOfFile")
class STU
{
public:
char snum[10]; //学号
char sname[10]; //姓名
char ssex[2]; //姓别
long sage; //年龄
char smajor[20]; //专业
public:
STU(){}
~STU(){}
};
int _tmain(int argc, _TCHAR* argv[])
{
STU student;
::CoInitialize(NULL);//初始化OLE/COM库环境,为访问ADO接口做准备
_RecordsetPtr m_pRecordset("ADODB.Recordset");
_ConnectionPtr m_pConnection("ADODB.Connection");
_bstr_t bstrSQL("select * from stu_info"); //SQL 查询语句
char* query_cmd="DELETE FROM stu_info WHERE sname='本拉登'";
try
{
m_pConnection.CreateInstance("ADODB.Connection");//创建Connection对象
//设置连接字符串 必须是BSTR or _bstr_ 类型 uid 和 pwd 账户和密码可以自己设置
//如果数据库在网上,则Server形如(192.168.1.5.3340)
//server=(local):数据库服务器的地址,如果server的值为(local),表示是当前电脑;
//UID=sa:数据库的用户名是sa;pwd=sa:数据库的密码是sa;
//database=student:数据库的库名是student;
//Provider=SQLOLEDB 数据库采用SQL的方式连接
_bstr_t strConnect="Provider=SQLOLEDB;Server=(local);Database=student;uid=sa;pwd=sa;";
m_pConnection->Open(strConnect,"","",adModeUnknown);
if (m_pConnection==NULL)
{
cerr<<"Lind data ERROR!\n";
}
//创建记录集
m_pRecordset.CreateInstance(_uuidof(Recordset));
//取得表中的记录
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
_variant_t vsnum,vsname,vsage,vssex,vsmajor; //对应库中的snum,sname,sage,ssex,smajor
cout<<"学号姓名";
cout<<"\n-------------------------------------------\n";
while (!m_pRecordset->EndOfFile)
{
vsnum = m_pRecordset->GetCollect(_variant_t((long)0));//这儿给字段编号和字段名都可以
vsname = m_pRecordset->GetCollect("sname");
vsage = m_pRecordset->GetCollect("sage");
vssex = m_pRecordset->GetCollect("ssex");
vsmajor = m_pRecordset->GetCollect("smajor");
if (vsnum.vt != VT_NULL && vsname.vt != VT_NULL && vsage.vt != VT_NULL
&& vssex.vt != VT_NULL && vsmajor.vt != VT_NULL)
{
cout.setf(ios::left);
cout << setw(14) <<(char*)(_bstr_t)vsnum;
cout << setw(14) << (char*)(_bstr_t)vsname;
cout << setw(8) << vsage.lVal;
cout << setw(8) << (char*)(_bstr_t)vssex;
cout <MoveNext(); ///移到下一条记录
}
cout << "\n----------------------------------------------------------------\n";
cout << "\n请输入你要添加的学生信息\n";
cout << "学号:";
cin >> student.snum;
cout << "\n姓名:";
cin >> student.sname;
cout<< "\n年龄:";
cin >> student.sage;
cout << "\n姓别:";
cin >> student.ssex;
cout << "\n专业:";
cin >> student.smajor;
m_pRecordset->MoveFirst(); //移动到第一条记录
m_pRecordset->AddNew(); ///添加新记录
m_pRecordset->PutCollect("snum",_variant_t(student.snum));
m_pRecordset->PutCollect("sname",_variant_t(student.sname));
m_pRecordset->PutCollect("sage",_variant_t(student.sage));
m_pRecordset->PutCollect("ssex",_variant_t(student.ssex));
m_pRecordset->PutCollect("smajor",_variant_t(student.smajor));
m_pRecordset->Update();
m_pConnection->Execute(query_cmd,NULL,1); //用Execute执行sql语句来删除
m_pRecordset->Close(); // 关闭记录集
}
// 捕捉异常
catch(_com_error c)
{
cerr<<"\nERROR:"<<(char*)c.Description();
}
if(m_pConnection->State)
m_pConnection->Close();
::CoUninitialize();
return 0;
}
5:代码亲测,可以使用。