Wince MFC OLE DB SQLCE数据库访问技术(二):嵌入式目标平台创建本地数据库sdf文件
2013-04-01 14:19
627 查看
前言
上一节已经讲述了嵌入式目标平台上安装sqlCE,本章将介绍如何在目标平台上创建本地数据库sdf文件。
备注:博客中所有关于Wince MFC OLE DB SQLCE数据库访问技术的文章都是基于SQL Server 2005 Compact Edition即 sqlCE 3.x
在讲述sqlCE之前,先来了解下,sqlCE优于wince 自带数据库的特点:
上表中,我们最为关心的数据,应该是支持的列数和数据量,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下添加头文件引用:
[cpp]
view plaincopyprint?
#include "ssceoledb30.h"
#include "ca_merge30.h"
#include "ssceerr30.h"
CoInitializeEx(NULL, COINIT_MULTITHREADED)是为了初始化COM 环境,由于OLE 依赖于COM ,使用OLE之前,先对COM 环境进行初始化,COINIT_MULTITHREADED,允许多线程。
CHelloCEDoc::CreateDatabase()代码如下:
[cpp]
view plaincopyprint?
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();
}
到此为止本地helloCE.sdf数据库文件已经创建成功。
版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2010/04/01/5441657.aspx
并请联系谭海燕本人或者前往谭海燕个人主页留言
上一节已经讲述了嵌入式目标平台上安装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 |
SQL Server Compact Edition 支持下列数据类型:
数据类型 | 说明 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
bigint | 整数数据,从 –2^63 (–9,223,372,036,854,775,808) 到 2^63–1 (9,223,372,036,854,775,807)。存储大小为 8 字节。 | ||||||||||
integer | 整数数据,从 –2^31 (-2,147,483,648) 到 2^31–1 (2,147,483,647)。 存储大小为 4 字节。 | ||||||||||
smallint | 整数数据,从 –32,768 到 32,767。存储大小为 2 字节。 | ||||||||||
tinyint | 整数数据,从 0 到 255。存储大小为 1 字节。 | ||||||||||
bit | 整数数据,值为 1 或 0。 存储大小为 1 位。 | ||||||||||
numeric (p, s) | 精度和小数位数固定的数值数据,取值范围从 –10^38+1 到 10^38–1。p 变量指定精度,取值范围从 1 到 38。s 变量指定小数位数,取值范围从 0 到 p。 存储大小为 19 字节。 | ||||||||||
money | 货币数据值,从 (–2^63/10000) (–922,337,203,685,477.5808) 到 2^63–1 (922,337,203,685,477.5807),准确度为货币单位的万分之一。存储大小为 8 字节。 | ||||||||||
float | 浮点数数据,从 –1.79E +308 到 1.79E+308 存储大小为 8 字节。 | ||||||||||
real | 浮点精度数字数据,从 –3.40E+38 到 3.40E+38。 存储大小为 4 字节。 | ||||||||||
datetime | 日期和时间数据,从 1753 年 1 月 1 日到 9999 年 12 月 31 日,准确度为三百分之一秒或 3.33 毫秒。值被圆整到 .000、.003 或 .007 毫秒增量。 存储为两个 4 字节整数。前 4 个字节存储早于或晚于 base date 1900 年 1 月 1 日的天数。基准日期是系统的参照日期。不允许 datetime 的值早于 1753 年 1 月 1 日。后 4 个字节存储一天之中的具体时间,被表示为从午夜算起的毫秒数。秒数的有效范围是 0–59。
| ||||||||||
national character(n) Synonym:nchar(n) | 固定长度的 Unicode 数据,最大长度为 4000 个字符。默认长度 = 1。存储大小(以字节计)是输入的字符数的两倍。 | ||||||||||
national character varying(n) Synonym:nvarchar(n) | 可变长度的 Unicode 数据,长度值范围为从 1 到 4000 个字符。默认长度 = 1。存储大小(以字节计)是输入的字符数的两倍。 | ||||||||||
ntext¹ | 可变长度的 Unicode 数据,最大长度为 (2^30–2)/2 (536,870,911) 个字符。存储大小(以字节计)是输入的字符数的两倍。
| ||||||||||
nchar | n 个字符组成的固定长度的 Unicode 字符数据。n 必须是从 1 到 4,000 的值。存储大小是 n 字节的两倍。 | ||||||||||
binary(n) | 固定长度的二进制数据,最大长度为 8000 字节。默认长度 = 1。 存储大小是固定的,是在类型中声明的以字节为单位的长度。 | ||||||||||
varbinary(n) | 可变长度的二进制数据,最大长度为 8000 字节。默认长度 = 1。 存储大小可变。它表示值的长度(以字节为单位)。 | ||||||||||
image¹ | 可变长度的二进制数据,最大长度为 2^30–1 (1,073,741,823) 字节。 存储大小是值的以字节为单位的长度。 | ||||||||||
uniqueidentifier | 全局唯一标识符 (GUID)。存储大小为 16 字节。 | ||||||||||
IDENTITY [(s, i)] | 这是数据列的一个属性,而不是一个独特的数据类型。 只有整数数据类型的数据列可用于标识列。一个表只能有一个标识列。可以指定种子和增量,但不能更新列。 s (seed) = 起始值 i (increment) = 增量值 | ||||||||||
ROWGUIDCOL | 这是数据列的一个属性,而不是一个独特的数据类型。它是一个表中使用 uniqueidentifier 数据类型定义的列。一个表只能有一个 ROWGUIDCOL 列。 |
由于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下添加头文件引用:
[cpp]
view plaincopyprint?
#include "ssceoledb30.h"
#include "ca_merge30.h"
#include "ssceerr30.h"
[cpp] view plaincopyprint? 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();//自己添加的函数 } 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()代码如下:
[cpp]
view plaincopyprint?
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();
}
[cpp] view plaincopyprint? // 第一个属性集 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); // 第一个属性集 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
并请联系谭海燕本人或者前往谭海燕个人主页留言
相关文章推荐
- Wince MFC OLE DB SQLCE数据库访问技术(二):嵌入式目标平台创建本地数据库sdf文件
- Wince MFC OLE DB SQLCE数据库访问技术(一):嵌入式目标平台安装sqlCE
- Wince MFC OLE DB SQLCE数据库访问技术(一):嵌入式目标平台安装sqlCE
- .NET平台下WEB应用程序的部署(含创建数据库、水晶报表、及配置配置文件)
- C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例
- Flex快速入门系列之五:crossdomain.xml文件创建以及允许本地跨域访问远程资源
- Windows Phone 本地数据库创建、获取数据库物理文件、数据库引用---引用现有数据库文件
- android 数据库技术 | 文件系统,SDCARD访问,CONTENT PROVIDER,SQLITE ,CURSOR操作,CURSOR适配器,SQLITEHELPER,数据库设计模式
- SQL Server 2008 R2 附加数据库 “尝试打开或创建物理文件 拒绝访问”的解决办法
- C#-数据库访问技术 ado.net——创建 数据库连接类 与 数据库操作方法 以及简单的数据的添加、删除、修改、查看
- Android创建本地文件夹、创建本地文件以及访问本地文件
- Unity3D在Android平台使用嵌入式数据库Sqlite,解决无法找到数据库文件的问题
- 解决ASP.NET执行update-database命令,无法访问*.mdf本地localDb数据库文件的问题
- 创建访问本地文件系统的信任APPLET(1)
- SAE 平台代码实现数据库定时备份以及同步到本地 2014/09/11 09:39:01 分类: 技术随笔 1人评论 次浏览 SAE 只允许用户通过phpMyAdmin管理远程数据库,
- (0017)iOS 开发之Mac上安装Eclipse、创建java后台程序访问本地数据库
- Windows Phone 本地数据库创建、获取数据库物理文件、数据库引用---本地数据库创建
- Windows Phone 本地数据库创建、获取数据库物理文件、数据库引用---获取引用数据库物理文件
- 将阿里域名配置保存到execl文件(后面将使用到本地数据库平台等)
- 创建访问本地文件系统的信任APPLET