通过ODBC连接数据库
通过ODBC连接数据库(C++)
C++连接数据库的方法有很多种,在Visual C++和SQL server的实际开发中,一般使用ODBC或ADO技术进行开发,相关技术和产品也最为成熟。我们这里根据课程需要采用ODBC的方法。
我使用的平台的是VS2010和SQL server 2008,优点是VS2010支持一些比较新的特性,编程方便了很多,缺点是左侧的“服务器资源管理器”不支持SQL server 2000,但是没有关系,在SQL server 2008上是可以连上的,大家如果和我的平台不一样的话在编程细节上可能有些问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
要注意下。
有同学表示安装了SQL server 2008之后只能通过“windows 身份验证”登陆本地数据库,无法通过“SQL server 身份验证”登陆,这是由于安装的时候是通过“windows 身份验证”安装的,改一下配置即可:
1. 使用“windows 身份验证”登陆数据库,点击“登录名”,右击sa,选择属性,点击状
态,确保设置如
左侧图所示。
2. 右击本地服
务器名选择属
性,更改安全性
中的服务器身份
验证如下图所示
3. 右击地服务器名选择重新启动(这一部很重要)
4. 如何还有问题的话查看目录“D:\Program
google之 Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Log” 下的 ERRORLOG 文件,找到错误代码,
打开SQL server 2008 连接一个我们测试用的数据库,使用的10.214.6.98上的数据库db27,用户名和密码都是user277,执行以下命令: use db27
CREATE Table book (
bno char(8) ,
category char(10) ,
title varchar(40) not null,
press varchar(30) not null,
byear int CHECK(byear > 0),
author varchar(20) not null,
price decimal(7,2) CHECK(price > 0),
total int CHECK(total >= 0),
stock int CHECK(stock >= 0),
CONSTRAINT ck CHECK(stock <= total)
)
INSERT INTO book VALUES
(‘12345678’,’数据库’,’数据库系统原理教程’,’清华大学出版社’,1998,’王珊’,27.9,3,0)
INSERT INTO book VALUES
(‘12342378’,’数据库’,’数据库’,’清华大学出版社’,1998,’王珊’,27.9,3,0) INSERT INTO book
VALUES
(‘12341278’,’数据库’,’数据库’,’清华大学出版社’,1998,’王珊’,27.9,3,0) INSERT INTO book
VALUES
(‘14345678’,’数据库’,’数据库’,’清华大学出版社’,1998,’王珊’,27.9,3,0) 上面SQL语句执行的结果是在db27数据库中创建了一个名为book的表,里面有9列,随后添加了4个测试数据,现在将该数据源添加到ODBC数据源管理器中,打开路径“控制面板\所有控制面板项\管理工具”下的数据源(ODBC),添加新的数据源,选择“SQL Server”
名称设置为db27,服务器在10.214.6.98,使用user277用户登录,完成后点击测试数据源看能不能连上,显示测试成功后,在用户数据源中会看到刚刚添加的DSN:
我们编写一个简单的图形化界面,打开VS2010,新建项目,选择“MFC应用程序”,建立一个名为“DataBaseODBC”的项目,弹出的向导中更改应用程序类型为“基于对话框”,大家在实际编程中可以需要选择,这里只是为了做个示例,其他保持默认。点击工具箱中“List Control”空间,拖到面板中,完成之后应该是下图这个样子:
调整控件的view属性为Report,如下图所示,控件的样式会有相应的改变。
右击ListControl,添加变量,在对话框中输入名称,如
m_ListCtrl
将这个ListControl设置成9列,并设置一些格式: CRect rc;
m_ListCtrl.GetWindowRect(&rc); //获取控件大小
//设置了9列,大小是一样的
m_ListCtrl.InsertColumn(0, _T("书号"), LVCFMT_CENTER, rc.Size().cx/9, 0);
m_ListCtrl.InsertColumn(1, _T("类别"), LVCFMT_CENTER, rc.Size().cx/9, 1);
m_ListCtrl.InsertColumn(2, _T("书名"), LVCFMT_CENTER, rc.Size().cx/9, 2);
m_ListCtrl.InsertColumn(3, _T("出版社"), LVCFMT_CENTER, rc.Size().cx/9, 3);
m_ListCtrl.InsertColumn(4, _T("出版年份"), LVCFMT_CENTER, rc.Size().cx/9, 4);
m_ListCtrl.InsertColumn(5, _T("作者"), LVCFMT_CENTER, rc.Size().cx/9, 5);
m_ListCtrl.InsertColumn(6, _T("价格"), LVCFMT_CENTER, rc.Size().cx/9, 6);
m_ListCtrl.InsertColumn(7, _T("总藏书量"), LVCFMT_CENTER, rc.Size().cx/9, 7);
m_ListCtrl.InsertColumn(8, _T("目前库存数"), LVCFMT_CENTER, rc.Size().cx/9, 8);
//LVS_EX_GRIDLINES是希望显示网格;
//LVS_EX_FULLROWSELECT是希望被选中时整行反色显示;
//LVS_EX_HEADERDRAGDROP是让其支持点击表头排序;
//LVS_EX_TWOCLICKACTIVATE是希望有鼠标在未被选中的行上移动的时候有一些效
果 m_ListCtrl.SetExtendedStyle(m_ListCtrl.GetExtendedStyle() | LVS_EX_GRIDLINES |
LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP |
LVS_EX_TWOCLICKACTIVATE);
把这些代码放在BOOL CDataBaseODBCDlg::OnInitDialog()函数的return前,运行就有相
应的效果。
在头文件DataBaseODBCDlg.h中添加#include "afxdb.h","afxdb.h"
即MFC的ODBC类包括以下要用到的类:
CDatabase类:主要功能是建立与数据源的连接。
CRecordset类:该类代表从数据源选择的一组
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
(记录集),程序可以选择数据源中的
某个表作为一个记录集,也可以通过对表的查询得到记录集,还可以合并同一数据源中多个
表的列到一个记录集中(通过该类可对记录集中的记录进行滚动、修改、增加和删除等操作。
CDBException类:代表ODBC类产生的异常。
概括地讲,CDatabase针对某个数据库,它负责连接数据源;CRecordset针对数据源中的
记录集,它负责对记录的操作。
在头文件中添加一些定义,其中CDBVariant对象表示用于MFC ODBC类的可变数据类型。
private:
CDatabase m_db; // 将CDBVariant转化成字符串 CString VariantToCString(CDBVariant* var); public:
为了方便,我就不添加新的按钮,双击对话框的“确定”按钮,进入函数,注释掉里面的
OnOK函数,添加如下代码:
//连接数据库,打开数据源,这里的DSN就是之前在ODBC中设置的DSN
if(!m_db.IsOpen()
&& !m_db.OpenEx(_T("DSN=db27;UID=user277;PWD=user277"),
CDatabase::openReadOnly | CDatabase::noOdbcDialog))