浙江财经大学
信息管理与工程学院

Visual Studio 2015 连接 SQL SERVER 2016 (使用ADO+C++)

本文由 Ocrosoft 于 2016-11-13 21:01:03 发表

因为要做基于数据库的一个小系统,因为C++相比JAVA用得比较熟练,所以选择C++来写;
数据库本来是想用mySQL的,比较小,电脑固态盘本来就不大,不过既然已经装了那就用SQL Server好了,不商用盗版微软也不会找麻烦。

之前一直想用ODBC去连接SQL Server的,但是试了一晚上,还是连接返回值-1,最后只能放弃改用ADO,不过ADO用起来确实简单,而且技术也比较先进。

下面的每个小标题中代码都是不完整的,可能无法编译通过,只是分析,完整的代码会放在最后。
如果有什么地方有错误,请尽管指出来,十分感谢。
这里pre标签下面没有滚动条,有一些长的代码被挡住看不到,可以复制出来看,或者有什么办法可以解决请指教。

1.首先先创建一个C++的项目,Win32控制台应用。不要勾选空项目。

2.在stdafx.h中引入所需头文件,以及其他声明。

#include <windows.h>
#include <stdlib.h>  
#import "C:/Program Files (x86)/Common Files/System/ado/msado15.dll" no_namespace rename("EOF", "adoEOF") rename("BOF", "FirstOfFile")

以上是包含windows的头文件,并且引入ado所需的dll文件,后面是不引用命名空间,并且改变EOF和BOF的声明,防止冲突。

3.要成功使用ADO,需要先初始化COM,不然会出现ADO加载失败的错误,使用如下语句:

CoInitialize(NULL);
//代码
CoUninitialize();  

4.连接数据库
首先定义全局的变量:
分别是连接指针,命令指针,结果集指针。

_ConnectionPtr pConnection;
_CommandPtr pCmd;
_RecordsetPtr pRecord;

接下来就是连接数据库了,注释”连接数据库”下面的一行,
Data Source后面的是服务器的IP地址,因为是本机,所以就用了localhost;
Initial Catalog后面的是数据库的名称,如果是已知的数据库名,就直接在这里输入。因为我不知道,所以就用了master,到时候再use数据库就好了;
username是登陆的用户名,一般是sa,需要SQL开启混合身份验证;
password是sa的密码,这两个变量是之前定义的(函数传进来的),类型是_bstr_t,可以从char*转换过来,char*又可以从string转过来。
如果不传入以上两个,也可以直接这样写(固定死用户名为sa和密码为123456):

_bstr_t connectStr = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=master;User ID=sa;Password=123456";
        try
	{
		//创建连接实例
		hr = pConnection.CreateInstance("ADODB.Connection");
		if (SUCCEEDED(hr))//连接成功
		{
			//连接数据库
			_bstr_t connectStr = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=master;User ID=" + username + ";Password=" + password;
			hr = pConnection->Open(connectStr, "", "", adModeUnknown);
			return DBRET(1, "");//这个是我自己定义的结构体,不用管它(因为我把这个写成了一个函数),自己想返回或者输出什么都是可以的。
		}
		else//连接失败
		{
			return DBRET(0, "ADO加载失败");
		}
	}
	catch (_com_error e)//错误捕捉
	{
		return DBRET(0, (string)e.Description());//e.Description是错误信息
	}

5.执行sql语句
这里注释”执行查询”下面的一句就是主要的查询语句,
sql是要执行的sql语句,也是_bstr_t类型的,我是函数传入的。
pRecord是结果集指针,用来保存select等语句的查询结果的,至于怎么使用,这篇不讨论,还在学习中,不怎么会用。
一样不要管DBRET那个东西。

        try
	{
		_variant_t vAffected;
		//执行查询
		pRecord = pConnection->Execute(sql, &vAffected, adCmdText);
		return DBRET(1, "", pRecord);
	}
	catch (_com_error e)
	{
		return DBRET(0, (string)e.Description());
	}

6.关闭连接
这个pRecord->Close()是用来关闭结果集的,但是如果没有结果集,那么关闭会报错,虽然会被捕捉。(这是写成了函数的问题,全部写在main里面不会有问题);
pConnection->Close()是关闭数据库连接的;如果没有连接数据库就关闭也会报错。
还是不要管DBRET那个东西。

        try
	{
		//关闭连接和结果集
		//pRecord->Close();
		pConnection->Close();
		CoUninitialize();
		return DBRET(1, "");
	}
	catch (_com_error e)
	{
		return DBRET(0, (string)e.Description());
	}

7.完整代码

// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//

#pragma once

#include "targetver.h"
#include "windows.h"
#include <cstdio>
#include <string>
#include <cstdlib>
#include <iostream>
#import "C:/Program Files (x86)/Common Files/System/ado/msado15.dll" no_namespace rename("EOF", "adoEOF") rename("BOF", "FirstOfFile")
// TODO: 在此处引用程序需要的其他头文件
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
using namespace std;

_ConnectionPtr pConnection;
_CommandPtr pCmd;
_RecordsetPtr pRecord;

int main()
{
	CoInitialize(NULL);
	try
	{
		//创建连接实例
		auto hr = pConnection.CreateInstance("ADODB.Connection");
		if (SUCCEEDED(hr))//连接成功
		{
			printf_s("连接成功。\n");
			//连接数据库
			_bstr_t connectStr = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=master;User ID=sa;Password=123456";
			hr = pConnection->Open(connectStr, "", "", adModeUnknown);
			_variant_t vAffected;
			//执行查询
			pRecord = pConnection->Execute("use GCMagager",&vAffected, adCmdText);
			pRecord = pConnection->Execute("select * from users", &vAffected, adCmdText);
			//如果是select语句,这里对pRecord进行操作,获得字段名和记录值等。
			pRecord->Close();
			pConnection->Close();
		}
		else//连接失败
		{
			printf_s("ADO加载失败。\n");
		}
		CoUninitialize();
	}
	catch (_com_error e)//错误捕捉
	{
		cout << e.Description() << endl;
	}
	return 0;
}

欢迎转载,请保留出处与链接。Ocrosoft » Visual Studio 2015 连接 SQL SERVER 2016 (使用ADO+C++)

点赞 (3)or拍砖 (0)

相关推荐

  • 暂无文章

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址