SQL Server CE开发环境建立过程

摘要:
使用EVC4创建一个基于对话框的项目,添加一个按钮,并在其响应中测试Copysqlce.chm的CreatingDatabases部分中的代码。下载http://download.microsoft.com/download/d/0/3/d0337fad-0a9d-4c87-9fe2-c5a2916c7b80/ssceoledb.exe,其中是ssceoldb的压缩文件。h、 解压缩后,它将覆盖SqlCe安装目录的文件。您也可以访问以下网站:http://support.microsoft.com/default.aspx?scid=kb ; 我们;825393到目前为止,SQLCE.chm中CreatingDatabases的代码已经编译成功!调试期间,CoCreateInstance()失败,因为COM未初始化。

使用EVC4创建基于对话框的工程,增加一按键并在其响应中Copy sqlce.chm中Creating Databases部分代码进行测试。记录过程如下:

1) error C2065: 'DBPROPSET' : undeclared identifier 等79个编译错误
解决方法:在StdAfx.h中增加以下几个头文件 :

1 #include   <oledb.h>
2 #include   <oledberr.h>
3 #include   <coguid.h>
4 #include   "ca_mergex20.h"
5 #include   "ssceoledb.h"   //DBPROPSET

注:在CSDN上有一帖子,说明除了以上内容外,还需要修改并增加以下内容:

1 修改StdAfx.h
2 //#define   VC_EXTRALEAN   //   Exclude   rarely-used   stuff   from   Windows
3 //上面这条一定要注释掉的,并加入以下引用
4 ////////////////////////////////////////////////////////////////////////////////
5 //以下这几句很重要,否则编译会提示你错误
6 #define   DBINITCONSTANTS
7 #define   INITGUID

验证结果:不需要修改并增加以上内容,否则会产生错误:

StdAfx.obj : error LNK2005: IID_IUnknown already defined in dd2Dlg.obj
ARMV4IDbg/dd2.exe : fatal error LNK1169: one or more multiply defined symbols found

2) 编译产生以下错误:

ssceoledb.h(74)   :   error   C2061:   syntax   error   :   identifier   'DBPROPSET'
ssceoledb.h(100)   :   error   C2061:   syntax   error   :   identifier   'HCHAPTER'
ssceoledb.h(112)   :   error   C2061:   syntax   error   :   identifier   'HCHAPTER'
ssceoledb.h(116)   :   error   C2061:   syntax   error   :   identifier   'HCHAPTER'

解决方法:更新一下SqlCe里的ssceoldb.h文件。下载 http://download.microsoft.com/download/d/0/3/d0337fad-0a9d-4c87-9fe2-c5a2916c7b80/ssceoledb.exe,其中是ssceoldb.h的压缩文件,解压后覆盖SqlCe安装目录的文件。

也可以参考下面的网站: http://support.microsoft.com/default.aspx?scid=kb;en-us;825393

至此,SQLCE.chm中Creating Databases部分代码编译成功!

调试时,发现CoCreateInstance()失败,分析原因是COM未初始化。所以在应用开始与结束时分别调用:CoInitializeEx(NULL, COINIT_MULTITHREADED);和CoUninitialize();

调试代码执行完成,但功能是否实现待分析。

Creating Databases To create a new database, you must specify the DBPROP_INIT_DATASOURCE property to specify a name for the database.

Creating Secure Databases To create an encrypted database using the OLE DB Provider for SQL Server CE, you must pass the provider-specific property DBPROP_SSCE_ENCRYPTDATABASE as VARIANT_TRUE and specify a password by using the provider-specific property DBPROP_SSCE_DBPASSWORD.

示例代码如下(以下代码即为建立SQL CE时的调试代码):

 1 //Object declarations
 2 HRESULT    hr = NOERROR;
 3 DBPROPSET  dbpropset[2];
 4 DBPROP     dbprop[1]; // Property array to initialize the provider.
 5 DBPROP     sscedbprop[2]; // Property array for SSCE security properties
 6 INT        i = 0;
 7 IDBDataSourceAdmin *pIDBDataSourceAdmin = NULL;
 8 IUnknown           *pIUnknownSession = NULL;
 9 
10 //Create an instance of the OLE DB provider.
11 hr = CoCreateInstance( CLSID_SQLSERVERCE_2_0, 0, CLSCTX_INPROC_SERVER,
12     IID_IDBDataSourceAdmin, (void**)& pIDBDataSourceAdmin);
13 if(FAILED(hr))
14 {
15     goto Exit;
16 }
17 
18 //Initialize property structures.
19 VariantInit(&dbprop[0].vValue);
20 for(i = 0;i < sizeof(sscedbprop) / sizeof(sscedbprop[0]);i++)
21 {
22     VariantInit(&sscedbprop[i].vValue);
23 }
24 
25 //Specify the property with name of the database.
26 dbprop[0].dwPropertyID  = DBPROP_INIT_DATASOURCE;
27 dbprop[0].dwOptions   = DBPROPOPTIONS_REQUIRED;
28 dbprop[0].vValue.vt   = VT_BSTR;
29 dbprop[0].vValue.bstrVal = SysAllocString(L"数据库名.sdf");
30 if(NULL == dbprop[0].vValue.bstrVal)
31 {
32     hr = E_OUTOFMEMORY;
33     goto Exit;
34 }
35 
36 //Specify the property for encryption.
37 sscedbprop[0].dwPropertyID = DBPROP_SSCE_ENCRYPTDATABASE;
38 sscedbprop[0].dwOptions = DBPROPOPTIONS_REQUIRED;
39 sscedbprop[0].vValue.vt = VT_BOOL;
40 sscedbprop[0].vValue.boolVal = VARIANT_TRUE;
41 
42 //Specify the password.
43 sscedbprop[1].dwPropertyID = DBPROP_SSCE_DBPASSWORD;
44 sscedbprop[1].dwOptions = DBPROPOPTIONS_REQUIRED;
45 sscedbprop[1].vValue.vt = VT_BSTR;
46 sscedbprop[1].vValue.bstrVal = SysAllocString(L"数据库密码");
47 if(NULL == sscedbprop[1].vValue.bstrVal)
48 {
49     hr = E_OUTOFMEMORY;
50     goto Exit;
51 }
52 
53 //Initialize the property sets.
54 dbpropset[0].guidPropertySet = DBPROPSET_DBINIT;
55 dbpropset[0].rgProperties  = dbprop;
56 dbpropset[0].cProperties  = sizeof(dbprop)/sizeof(dbprop[0]);
57 
58 dbpropset[1].guidPropertySet = DBPROPSET_SSCE_DBINIT ;
59 dbpropset[1].rgProperties  = sscedbprop;
60 dbpropset[1].cProperties  = sizeof(sscedbprop)/sizeof(sscedbprop[0]);
61 
62 //Create and initialize the database.
63 hr = pIDBDataSourceAdmin->CreateDataSource(sizeof(dbpropset) / sizeof(dbpropset[0]),dbpropset,NULL,IID_IUnknown,&pIUnknownSession);
64 if(FAILED(hr))
65 {
66     goto Exit;
67 }
68 //At this point, the new encrypted database is created.
69 
70 Exit:
71 // Do cleanup tasks here.
72 
73 return;

Accessing Password-protected Databases Use the DBPROP_SSCE_DBPASSWORD property in the DBPROPSET_SSCE_DBINIT provider-specific property set to specify this property.

注:

一:注意每次操作SQL CE前都Close一次,因为SQLCE2.0只支持一个连接

二:检测数据库里是否存在某个表用:select table_name from Information_Schema.Tables

三:SQL CE 2.0 不支持存储过程、触发器等,都要用SQL来实现

四:从XML转换过来的时间要转换一下: DateTime dtConvert = DateTime.Parse(xmlTable.ChildNodes[0].InnerXml); dtConvert.ToString("G");

五:SQL CE的字段类型和SQL Server的不一样,具体见SQLCE帮助文档

六:SQL CE不支持Distict 、top 等函数,Distinct可以用GroupBy来实现

免责声明:文章转载自《SQL Server CE开发环境建立过程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇WinCE 自由拼音输入法的测试【SQL Server CE2.0】创建加密的数据库(源代码)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

图的搜索算法之迷宫问题和棋盘马走日问题

算法背景 迷宫问题和棋盘马走日问题都是搜索问题(找路径),一般采用DFS和BFS两种搜索算法都可以,如果要求是最短路径,则一般BFS解题,DFS则需要记录所有的可能路径,找到最短的那条。一般来说,迷宫问题的前进方向为四个(上下左右),障碍物直接用1和0来判断。而马走日则有特殊的障碍物判断规则,前进方向也扩展为了八个(上下左右和四个斜角)。下面就用算法实例来讲...

多进程Telnet的木马例子

//vc6.0完全通过一个多进程的telnet的木马例子 //ddxxkk //在命令行下执行程序可以telnet127.0.0.1999 //以后开机后就运行 #include"stdafx.h" #include #include #include #include #include #include #pragmacomment(lib,"ws2_32...

C语言 屏幕截图 (GDI)

截取全屏幕 #include <windows.h> void echo(CHAR *str); int CaptureImage(HWND hWnd, CHAR *dirPath, CHAR *filename); int main() { echo(TEXT("Ready")); CaptureImage(GetDesk...

C语言基础(16)-指针

一.指针的相关概念 1.1 指针变量 指针是一个变量,存放的是一个地址,该地址指向一块内存空间。 例: int a = 10; int *p = &a; //定义一个指针变量p,&符号可以取得一个变量在内存当前中的地址。 *p = 5; //修改指针所指的内存数据为5 1.2 无类型指针 定义一个指针变量,但不指定它指向具体哪种数据类...

linux socket 编程

socket 目 录 socket socket() bind() connect() listen() accept() send() 和recv() sendto() 和recvfrom() close() 和shutdown() getpeer...

一些常用的排序算法(C版)

1. 直接插入排序(稳定排序) 简单的说就是将序列分为有序序列和无序序列。每一趟排序都是将无序序列的第一个元素插入有序序列中。R[1… i-1] <- R[i…n] , 每次取R[i]插入到R[1… i-1]中。 步骤如下: 1> 在R[1 … i-1]中找到R[i]的插入位置k (0<k<i) 2> 将R[k … i-1]均后...