vs2010 win32程序中 sqlserver 2008 express的简单使用 (C++)

  由于短学期作业需要在之前程序的服务器中加入数据库,就简单学习了下vs2010中自带的数据库sqlsever2008,学习的过程并不是很顺利,在网上没有找到特别完整的教程,现在课程结束了,特地来写一个,以方便后面的孩纸们,由于本人也是学的半懂不懂的,如果有什么不对的地方还请大家指正!

一、从零开始,建立一个数据库

(1)打开VS2010,工具->连接到数据库,然后在弹出的对话中框选择“Microsoft SQL Server”,单击“继续”

(2)在下图所示对话框“服务器名”中输入“自己的计算机名\SQLEXPRESS”,如“Disturbance-PC\SQLEXPRESS”,单击“确定”。也可以先单击“测试连接”按钮进行测试,会弹出对话框提示。

(3)之前用VS2010的时候大家应该都有看到个叫“服务器资源管理器"的东西吧,反正我是注意到了,但是不知道它是干嘛的,现在才知道是管理数据库用的。执行过上面的操作后应该已经连接到了默认的master数据库,可以单击鼠标右键来添加表或其它东西,这里就不多说了吧。

(4) 如果你没有成功,可能是在安装Visual Studio时没有安装SQL Server组件。此时只需要重新运行Visual Studio的安装程序,选择“更改或移除Microsoft Visual Studio 2010”,单击下一步,再单击“添加或删除功能”,确保勾选“Microsoft SQL Server 2008 Express Studio”。

(5)此时SQL Server的服务默认已经启动。如果是你不小心手动将其停止的话,可以运行Sql Server 配置管理器将其启动(开始菜单中可以找到)。

二、完成了数据库的创建之后,我们首先想到的就是怎么在程序中去连接它了,这里我们用ADO的方法来连接。

(1)ADO使用步骤方法:

1. 初始化COM库,引入ADO库定义文件

2. 用Connection对象连接数据库

3. 利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理

4. 使用完毕后关闭连接释放对象

(2)具体操作:

1.添加头文件CADO.h,其中import的路径要根据自己电脑的系统来确定,反正找到msado15.dll就可以了。

 1 #pragma once
 2 #import "C:\Program Files (x86)\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
 3 #include <icrsint.h>
 4 class CADO
 5 {
 6 public:
 7     CADO(void);
 8     ~CADO(void);
 9     _ConnectionPtr m_pConnection;
10     _RecordsetPtr m_pRecordset;
11     void Connect(void);
12     void ExitConnect(void);
13     _RecordsetPtr& GetRecordset(_bstr_t SQL);
14 };

2.添加CADO.cpp,其中m_pConnection->ConnectionString后面的连接串的确定要根据自己电脑来确定,后面会讲到怎么得到连接串,我一开始就是因为找不到正确的连接串,浪费了好多时间。

 1 #include "ADO.h"
 2 #include<iostream>
 3 using namespace std;
 4
 5 CADO::CADO(void)
 6 {
 7 }
 8
 9
10 CADO::~CADO(void)
11 {
12 }
13
14 void CADO::Connect(void)
15 {
16     try{
17         CoInitialize(NULL);  //初始化COM环境
18         m_pConnection.CreateInstance("ADODB.Connection");  //创建连接对象
19         m_pConnection->ConnectionString="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=test;Initial Catalog=UserInfo1;Data Source=Disturbance-PC\\SQLEXPRESS";
20         HRESULT hr=m_pConnection->Open("", "", "", adModeUnknown);
21         if(hr!=S_OK)
22             cout<<"Can not connect to the specified database!"<<endl;
23     }
24     catch(_com_error e){
25         cout<<e.Description()<<endl;
26     }
27 }
28 void CADO::ExitConnect(void)
29 {
30     if(m_pRecordset!=NULL){
31         m_pRecordset->Close();
32         m_pConnection->Close();
33     }
34     ::CoUninitialize();  //释放环境
35 }
36
37 _RecordsetPtr& CADO::GetRecordset(_bstr_t SQL)
38 {
39     m_pRecordset=NULL;
40     CADO link;
41     try{
42         if(m_pConnection==NULL)
43             Connect();
44         m_pRecordset.CreateInstance(__uuidof(Recordset));
45         m_pRecordset->Open((_bstr_t)SQL, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
46     }
47     catch(_com_error e){
48         cout<<e.Description()<<endl;
49         m_pRecordset=NULL;
50         return m_pRecordset;
51     }
52     return m_pRecordset;
53 }

3.在main函数中进行数据库操作,有几个注意事项

(1).对m_pRecordset=record.GetRecordset(bstr_t);这句话,一直不知道返回值是个什么,之后才发现可以把它理解为一个指针,指向你所查找的满足条件的数据的第一行,我们只需要配合m_pRecordset->MoveNext();往下移一行就可以遍历整个表,而m_pRecordset->PutCollect和m_pRecordset->GetCollect可以分别对当前行特定列的数据进行存取,知道了这些,你就可以完成一些数据库的基本操作了,如果需要更多的功能,请自行百度ADO操作的函数。

(2).m_pRecordset->GetCollect返回的类型是_variant_t,对于字符串类型的数据项,要用CString()强制转换,我尝试了网上的很多方法来转char*都没有成功,这个问题也浪费了好多的时间,如果大家有什么方法的话一定要分享一下哈。

 1 #include<afxwin.h>
 2 #include <iostream>
 3 #include "ADO.h"
 4 #include<string>
 5 using namespace std;
 6
 7 void main()
 8 {
 9
10     string sql;
11     CADO record;
12     record.Connect();
13     _RecordsetPtr m_pRecordset;
14     sql="select * from UserInfo";//这句话代表找到数据库中表UserInfo的位置
15     _bstr_t bstr_t(sql.c_str());
16     m_pRecordset=record.GetRecordset(bstr_t);//返回的可以假设是一个指针,它指向该表的第一行
17
18     //m_pRecordset->MoveFirst();    //移到首条记录
19     while(!m_pRecordset->adoEOF){
20         m_pRecordset->Delete(adAffectCurrent);    //删除当前记录
21         m_pRecordset->MoveNext();//移动到下一行
22     }
23
24     _variant_t vUsername,vBirthday,vID,vOld;
25     for(int i=0;i<3;i++)    //添加三条新记录并赋值
26     {
27         m_pRecordset->AddNew();    //添加新记录
28         m_pRecordset->PutCollect("学号",_variant_t((int)(i+10)));
29         m_pRecordset->PutCollect("姓名",_variant_t("ADASA"));
30         m_pRecordset->PutCollect("年龄",_variant_t((int)21));
31         m_pRecordset->PutCollect("生日",_variant_t("1930-3-15"));
32     }
33     m_pRecordset->Update();    //保存到库中,和AddNew对应
34
35     m_pRecordset=record.GetRecordset(bstr_t);//再次获得第一行的指针
36     while(!m_pRecordset->adoEOF)
37     {
38         vID = m_pRecordset->GetCollect(_variant_t((long)0));//取得第1列的值,从0开始计数,你也可以直接给出列的名称,如下一行
39         vUsername = m_pRecordset->GetCollect("姓名");//取得姓名字段的值
40         vOld = m_pRecordset->GetCollect("年龄");
41         vBirthday = m_pRecordset->GetCollect("生日");
42         printf("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",
43             vID.lVal,
44             CString(vUsername.bstrVal),
45             vOld.lVal,
46             CString(vBirthday.bstrVal));  //在DEBUG方式下的OUTPUT窗口输出记录集中的记录
47         m_pRecordset->MoveNext();    //移到下一条记录
48     }
49     record.ExitConnect();
50 }

三、连接字符串的获取

别小看这个字符串,要是没有正确的方法,还真的那它没辙啊!!这里直接复制网上找到的方法了:

  任意新建一个txt文件,重命名为.x.udl。然后双击此文件,将出现“数据库连接属性”窗口。第一个标签页“提供程序”列出了所有数据库引擎,Access, SQL Server, Oracle等,选择后点下一步跳至第二个标签页“连接”,选择服务器名称栏可以填上服务器的IP地址,本机则可不填或填点号(我这里填了“自己的计算机名\SQLEXPRESS”才连上);填上数据库用户名和密码后就可以选择数据库了。点“测试连接”按钮,成功。确定。用记事本打开x.udl。将会看到它生成的连接字符串。如下:

"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=test;Initial Catalog=UserInfo1;Data Source=Disturbance-PC\\SQLEXPRESS";

此连接串中,Persist Security Info属性为True时表示在建立连接后仍然保存密码,一般取False即可。ID和Password属性只有在上述数据库属性对话框中勾选“允许保存密码”时才会有。自己可以手工添加。Cfdata是我的数据库名。

  PS:如果连接串里面有‘\’符号的话,要写成‘\\‘,不然会因为转义出问题。

至此就大功搞成了,步骤好少哇。

整个教程引用了很多别人的代码和教程,希望能帮助到大家把^^

转发请注明出处哦:http://www.cnblogs.com/SolarWings/

参考的链接:

1.使用VS2010内部的数据库sqlserver2008
http://bbs.cfan.com.cn/thread-1530883-1-1.html

2.在win32程序中连接数据库
http://www.cnblogs.com/littlex/archive/2012/07/03/2574782.html

3.上个步骤中的连接字符串会出问题,正确方法参见
http://blog.csdn.net/asanscape/article/details/6084600

vs2010 win32程序中 sqlserver 2008 express的简单使用 (C++)

时间: 2024-10-11 11:21:20

vs2010 win32程序中 sqlserver 2008 express的简单使用 (C++)的相关文章

使用AllocConsole在Win32程序中调用控制台调试输出

近期一个Win32窗口项目中,调试时经常需要输出调试信息以追踪数据流及程序运行状态. 起初我封装了一系列文件操作,实现了日志形式的调试信息输出,但在后期的使用过程中越发觉得颇不顺手.那么,如何方便地在Win32程序中使用控制台进行调试输出?答案如题:AllocConsole函数和C-Runtime的freopen函数.具体操作流程如下: 打开控制台 重定向输出流至控制台 执行调试信息输出操作 完整代码如下: SetConsoleTitle(_T("Debug Output")); fr

在Win32程序中显示Dos调试窗口,可暂停(AllocConsole,WriteConsole,FreeConsole函数,GetStdHandle函数取得输入句柄)

在很多程序中,都可以看到程序运行中,会有一个Dos窗口,实时显示一些运行信息,这里就告诉大家是如何实现的,我们做个简单的,其实对控制台的操作还有很多,有兴趣的可以去查资料. 用到的API函数如下: //创建控制台 AllocConsole; //获取控制台窗口 GetStdHandle; //向控制台输出信息 WriteConsole; //释放控制台 FreeConsole; unit Unit1; interface uses Windows, Messages, SysUtils, Var

Win32程序中使用 Combo box控件

  SendMessage函数向窗口发送消息 LRESULT SendMessage( HWND hWnd,     // handle to destination window UINT Msg,      // message WPARAM wParam, // first message parameter LPARAM lParam   // second message parameter ); 1 向Combo Box添加数据 HWND hWndComboBox = GetDlgI

在Win32程序中嵌入Edge浏览器组件

代码未经测试,只做个记录 据说只是改了UA. 在注册表修改这个路径,并且把自己程序添加进去,写一个浏览器控件的版本号,只要高于12000就自动改为Edge. For 64bit applications, 32bit only Windows or current user: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION] "Exampl

在WIn32程序中使用MFC的CInternetSession运行异常,主要是因为获取目前应用程序名出错的解决办法

转载:http://group.gimoo.net/review/22564 头文件#include <afxinet.h"> 在非MFC工程中使用CInternetSession抛异常的原因,调试跟踪到说AfxGetAppName为空 解决办法:创建CInternetSession 有参对象 CInternetSession InternetSession(_T("myagent"));

在win32控制台应用程序中实现定时器

1.SetTimer:在控制台应用程序中同样可以用SetTimer实现定时器的效果. 普通的win32程序中定时器的应用很多也很方便,但是在win32控制台中也是可以使用定时器的,利用的是windows程序的消息循环机制,如下: #include<iostream> #include<windows.h> using namespace std; //定时器ID DWORD dwTimerId = 0; void CALLBACK TimeProc( HWND hwnd, UINT

一起学libcef--搭建自己的libcef运行环境(Win32程序,错误C2220解决方案)

转自 http://blog.csdn.net/wangshubo1989/article/details/50180413 现在就来讲讲如何在自己的win32程序中搭建libcef运行环境. 首先就是建一个空的win32项目,例如名字为TestLibCef. 1. cefsimple目录(注意是拷贝文件夹)拷贝到新工程下并包含在项目中(注意,是TestLibCef\TestLibCef文件夹下) 2. 并在TestLibCef\TestLibCef文件夹下,新建一个dll文件夹 源码把Debu

在Web应用程序中执行计划任务(多线程)

在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务.实现计划任务的方法也有很多,可以采用SQLAgent执行存储过程来实现,也可以采用Windows任务调度程序来实现,也可以使用Windows服务来完成我们的计划任务,这些方法都是很好的解决方案.但是,对于Web应用程序来说,这些方法实现起来并不是很简单的,主机服务提供商或者不能直接提供这样的服务,或者需要你支付许多额外的费用. 本文就介绍

Visual C++ 2008 Express Edition开发SDK应用程序

1.   启动Visual C++ 许多从来没有编写过Windows应用程序的人可能会认为这是一件很费力的事情,但是选择正确的编程工具可以让我们的工作变得简单一些.在这里我们选择VC++2008,同时又采用开源的wxWidgets库来开发程序,这是非常强大的库,会使我们编写Windows程序更加简单.特别在跨平台设计也会更方便.朋友们得多花一些时间来学习Visual C++的基本知识,磨刀不误砍柴功. 从Windows的开始菜单中选择Microsoft Visual C++ 2008 Expre