前言
上一节已经讲述了嵌入式目标平台上安装sqlCE,本章将介绍如何在目标平台上创建本地数据库sdf文件。
备注:博客中所有关于Wince MFC OLE DB SQLCE数据库访问技术的文章都是基于SQL Server 2005 Compact Edition即 sqlCE 3.x
在讲述sqlCE之前,先来了解下,sqlCE优于wince 自带数据库的特点:
类别 | 对象 | 最大大小限制 |
---|---|---|
存储 |
列名 |
128 个字符 |
|
表中的列数 |
1024 |
行大小 |
8060 字节 |
|
|
数据库密码 |
40 个字符 |
|
数据库大小 |
4 GB 1 |
|
数据库大小增量 |
增量为 1 页或 16 页(取决于表大小) |
|
页大小 |
4 KB |
|
会话数 |
256 |
|
BLOB(ntext 和 image)列的大小 |
2 GB |
|
表名 |
128 个字符 |
|
表大小 |
512 MB |
查询 |
SQL 语句中的字符数 |
无限制 |
|
游标中的列数 |
1024 |
|
ORDER BY、GROUP BY 或 DISTINCT 子句中的列数 |
10242 |
|
嵌套子查询的层数 |
无限制 |
|
命名的参数 |
支持 |
|
查询中操作数的数量 |
无限制 |
|
联接中表的数量 |
无限制 |
索引 |
BLOB 列 |
无法索引 |
|
索引键中的字节数 |
5123 |
|
索引中的列数 |
16 |
|
每个表的索引数 |
249 |
约束 |
PRIMARY KEY、UNIQUE、默认约束和 FOREIGN KEY |
支持 4 |
每个表的约束数 |
249 |
上表中,我们最为关心的数据,应该是支持的列数和数据量,wince自带数据库最多支持4个字段,而且数据量很有限,而且操作非常复杂。
SQL Server Compact Edition 支持下列数据类型:
¹在 SQL Server Compact Edition 中,当字节数超过 256 时,Ntext 和 image 数据将存储于新的数据页中。由于 SQL Server Compact Edition 数据库可以按页而不是字节进行压缩,因此这会影响数据库的压缩程度。
由于MFC没有提供直接操作sqlCE数据库的API和封装好的类,为了访问和操作sqlCE,我们需要借助MFC的OLE DB 来访问和操作sqlCE数据库。
下面开始介绍wince 下MFC中通过OLE DB创建我们的第一个helloCE.sdf数据库文件。
第一步:创建MFC单文档应用程序工程
第二步:包含以下几个头文件
ca_merge30.h
ssceerr30.h
ssceoledb30.h
把这几个头文件复制到EVC查找头文件的地方或者直接复制到应用程序工程当前目录下。然后#include就ok。
然后直接在CHelloCEDoc下添加头文件引用:
- #include "ssceoledb30.h"
- #include "ca_merge30.h"
- #include "ssceerr30.h"
为了演示方便,直接在CHelloCEDoc::CHelloCEDoc()构造函数中创建本地数据库文件helloCE.sdf。
CHelloCEDoc::CHelloCEDoc()代码如下:
- CHelloCEDoc::CHelloCEDoc()
- {
- // TODO: add one-time construction code here
- HRESULT hr;
- hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
- if(hr < 0)
- {
- MessageBox(NULL, "COM Initialization Failure", "ERROR", MB_OK);//出错处理
- return;
- }
- hr = CreateDatabase();//自己添加的函数
- }
CoInitializeEx(NULL, COINIT_MULTITHREADED)是为了初始化COM 环境,由于OLE 依赖于COM ,使用OLE之前,先对COM 环境进行初始化,COINIT_MULTITHREADED,允许多线程。
CHelloCEDoc::CreateDatabase()代码如下:
- DBPROP dbprop[1]; //OLEDB属性
- DBPROPSET dbpropset[1]; //OLEDB属性集
- IDBInitialize *pIDBInitialize = NULL; //OLEDE接口指针
- VariantInit(&dbprop[0].vValue);//将vValue初始化为VT_EMPTY,实际定义中,VT_EMPTY= 0
- //创建一个连接数据库的COM接口对象,打开数据库接口IID_IDBInitialize
- hr = CoCreateInstance( CLSID_SQLSERVERCE_3_0,
- 0,
- CLSCTX_INPROC_SERVER,
- IID_IDBInitialize,
- (void**)&pIDBInitialize);
- if(hr < 0 )
- {
- goto Exit;
- }
- //初始化接口属性
- dbprop[0].dwPropertyID = DBPROP_INIT_DATASOURCE;
- dbprop[0].dwOptions = DBPROPOPTIONS_REQUIRED;
- dbprop[0].vValue.vt = VT_BSTR;
- dbprop[0].vValue.bstrVal= SysAllocString("helloCE.sdf");//指定数据库名
- if(NULL == dbprop[0].vValue.bstrVal)
- {
- hr = E_OUTOFMEMORY;
- goto Exit;
- }
- //初始化属性集
- dbpropset[0].guidPropertySet = DBPROPSET_DBINIT;
- dbpropset[0].rgProperties = dbprop;
- dbpropset[0].cProperties = sizeof(dbprop)/sizeof(dbprop[0]);
- //获取数据库初始化属性,得到的数据库初始化的属性接口指针放在pIDBProperties
- hr = pIDBInitialize->QueryInterface(IID_IDBProperties, (void **)&pIDBProperties);
- if(hr < 0)
- {
- goto Exit;
- }
- hr = pIDBProperties->SetProperties(1, dbpropset);
- if(hr < 0)
- {
- goto Exit;
- }
- //根据初始化的属性连接到数据库
- hr = pIDBInitialize->Initialize();
- if(hr < 0)
- {
- goto Exit;
- }
- Exit:
- // 清空
- VariantClear(&dbprop[0].vValue);
- // 释放接口
- if(pIDBProperties)
- {
- pIDBProperties->Release();
- }
- if (pIDBInitialize)
- {
- pIDBInitialize->Release();
- }
当我们通过创建了IID_IDBInitialize接口之后,就需要设置指定连接数据库的参数,这些参数在OLEDB中,叫做属性,OLEDB的属性被分成几组,每一组就是一个属性集。通常我们需要指定数据库实例名,数据库名,连接数据库的用户名以及密码等等属性。属性集中的属性必须连续存放。此实例中,只定义了一个属性DBPROP[1],所以属性必须以数组形式存放。每个属性都必须单独作为数组的元素来设定。例如,我们要设置数据库名,和访问数据库的密码,我们就要设置两个属性集。
例如:
如果我们创建两个属性集,一个用于设置需要打开的数据库名称和打开方式一个用于设置打开数据库时所需的密码
- // 第一个属性集
- DBPROPSET dbpropset[2];
- DBPROP dbprop[1], sscedbprop[1];
- //设置要访问的数据的名称 和访问方式
- dbprop[0].dwPropertyID = DBPROP_INIT_DATASOURCE;
- dbprop[0].dwOptions = DBPROPOPTIONS_REQUIRED;
- dbprop[0].vValue.vt = VT_BSTR;
- dbprop[0].vValue.bstrVal= SysAllocString(lpsSDFName);
- if(NULL == dbprop[0].vValue.bstrVal)
- {
- hr = E_OUTOFMEMORY;
- goto Exit;
- }
- dbpropset[0].guidPropertySet = DBPROPSET_DBINIT;
- dbpropset[0].rgProperties = dbprop;
- dbpropset[0].cProperties = sizeof(dbprop)/sizeof(dbprop[0]);
- //第二个属性集设置特定访问接口行集属性
- //设置访问密码
- sscedbprop[0].dwPropertyID = DBPROP_SSCE_DBPASSWORD;
- sscedbprop[0].dwOptions = DBPROPOPTIONS_REQUIRED;
- sscedbprop[0].vValue.vt = VT_BSTR;
- sscedbprop[0].vValue.bstrVal = SysAllocString(lpsPassWord);
- if(NULL == sscedbprop[0].vValue.bstrVal)
- {
- hr = E_OUTOFMEMORY;
- goto Exit;
- }
- dbpropset[1].guidPropertySet = DBPROPSET_SSCE_DBINIT;
- dbpropset[1].rgProperties = sscedbprop;
- dbpropset[1].cProperties = sizeof(sscedbprop)/sizeof(sscedbprop[0]);
- //······其他代码
- //设置属性
- hr = pIDBProperties->SetProperties(sizeof(dbpropset)/sizeof(dbpropset[0]), dbpropset);
到此为止本地helloCE.sdf数据库文件已经创建成功。
版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2010/04/01/5441657.aspx