1.安装sql server,然后安装ssms(Microsoft SQL Server Management Studio),这是可视化操作数据库的界面。在安装时创建账户sa
如果出现连接不上:https://jingyan.baidu.com/article/154b46310e5c1f28ca8f411f.html
2.用ssms创建表格,在VS中代码如下:
1.添加头文件
#include "windows.h"
#include <tchar.h>
using namespace std;
#import"C:\\Program Files\\Common Files\\System\\ado\\msado15.dll" no_namespace rename("EOF","EndOfFile")
msado15.dl可能会报错,早不到某些文件,不用管,直接编译,编译后会产生需要的文件。
2.这是别人的源码
int main()
{
STU student;
::CoInitialize(NULL);//初始化OLE/COM库环境,为访问ADO接口做准备
_RecordsetPtr m_pRecordset("ADODB.Recordset");//定义记录集对象
_ConnectionPtr m_pConnection("ADODB.Connection");//定义数据库连接对象
_bstr_t bstrSQL("select * from facedata"); //SQL 查询语句
// char* query_cmd ="DELETE FROM stu_info WHERE sname='s'";
try//try catch 用于抛出异常
{
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=facedata;uid=sa;pwd=(密码);";
m_pConnection->Open(strConnect, "", "", adModeUnknown);//建立连接
if (m_pConnection == NULL)
{
cerr << "Load 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));//这儿给字段编号和字段名都可以 取第一列的值,从0开始
vsname = m_pRecordset->GetCollect("facenum");//这是第一列,和上面输出一样
vsage = m_pRecordset->GetCollect("facedata");
if (vsnum.vt != VT_NULL && vsname.vt != VT_NULL && vsage.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)vsage;
//cout << setw(20) << (char*)(_bstr_t)vsmajor;
cout.unsetf(ios::left);//取消已设置的格式
cout << endl;
}
m_pRecordset->MoveNext(); ///移到下一条记录
}
cout << "\n----------------------------------------------------------------\n";
cout << "\n请输入你要添加的学生信息\n";
cout << "姓名:";
cin >> student.snum;
cout << "\n代号:";
cin >> student.sname;
m_pRecordset->MoveFirst(); //移动到第一条记录
m_pRecordset->AddNew(); ///添加新记录
m_pRecordset->PutCollect("facenum", _variant_t(student.snum));
m_pRecordset->PutCollect("facedata", _variant_t(student.sname));
m_pRecordset->Update();//保存数据
// bm_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;
}
3.这是使用ADO保存二进制文件时写的,存数据成功,读数据失败(数据指unsinged char),char,int是成功的。
void ado()
{
#import"C:\\Program Files\\Common Files\\System\\ado\\msado15.dll" no_namespace rename("EOF","EndOfFile")
//定义数据库
::CoInitialize(NULL);//初始化OLE/COM库环境,为访问ADO接口做准备
_RecordsetPtr m_pRecordset("ADODB.Recordset");//定义记录集对象
_ConnectionPtr m_pConnection("ADODB.Connection");//定义数据库连接对象
_bstr_t bstrSQL("select * from Table_1"); //SQL 查询语句
char name[10] = { 0 };//存储姓名
//存取数据
try
{
cout << "姓名:";
//cin >> name;
cout << endl;
m_pConnection.CreateInstance("ADODB.Connection");//创建Connection对象
_bstr_t strConnect = "Provider=SQLOLEDB;Server=(local);Database=facedata;uid=sa;pwd=xhl18883779046;";
m_pConnection->Open(strConnect, "", "", adModeUnknown);//建立连接
if (m_pConnection == NULL)
{
cout << "Load data ERROR!\n";
}
//创建记录集
m_pRecordset.CreateInstance(_uuidof(Recordset));
//取得表中的记录
m_pRecordset->Open(bstrSQL, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);//连接表格
VARIANT varBLOB;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
m_pRecordset->AddNew(); ///添加新记录
m_pRecordset->PutCollect("name", _variant_t(name));
if (copyfeature1.feature)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = copyfeature1.featureSize;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound); ///创建SAFEARRAY对象
for (long i = 0; i < (long)copyfeature1.featureSize; i++)
SafeArrayPutElement(psa, &i, copyfeature1.feature++); ///将pBuf指向的二进制数据保存到SAFEARRAY对象psa中
varBLOB.vt = VT_ARRAY | VT_UI1; ///将varBLOB的类型设置为BYTE类型的数组
varBLOB.parray = psa; ///为varBLOB变量赋值
m_pRecordset->GetFields()->GetItem("data")->AppendChunk(varBLOB);///加入BLOB类型的数据
}
m_pRecordset->Update(); ///保存我们的数据到库中
//_variant_t varBLOB1;
long n = copyfeature1.featureSize;
varBLOB = m_pRecordset->GetFields()->GetItem("data")->GetChunk(n);
if (varBLOB.vt == (VT_ARRAY | VT_UI1)) ///判断数据类型是否正确
{
//char *pBuf = NULL;
copyfeature1.feature = (MByte *)malloc(lDataSize);//分配内存
memset(copyfeature1.feature, 0, lDataSize);//数组全为0
SafeArrayAccessData(varBLOB.parray, (void **)©feature2.feature); ///得到指向数据的指针
SafeArrayUnaccessData(varBLOB.parray);
SafeArrayDestroy(varBLOB.parray);
}
m_pRecordset->Update();
m_pRecordset->Close(); // 关闭记录集
}
// 捕捉异常
catch (_com_error c)
{
cerr << "\nERROR:" << (char*)c.Description() << endl;
}
if (m_pConnection->State)
m_pConnection->Close();
::CoUninitialize();
}