windows phone数据库开发

http://wenku.baidu.com/view/020f7bd528ea81c758f57889.html

目录
1、Windows Phone数据库开发指南
2、Windows Mobile上使用WINCE自带数据库
3、XML on Windows Mobile C#
4、关于如何在ppc模拟器中读取本地xml文件的办法
5、设置 Windows 窗体 DataGridView 控件中的数据格式
6、移动平台数据库开发心得
7、用SQL Anywhere创建Windows Mobile数据库
8、用Sybase移动数据库开发CRM系统几个关键问题的技术实现
9、智能设备开发环境的配置过程
4 / 42
Windows Phone 数据库开发指南
移动解决方案系统结构的各个部分正在快速地变为现实,并逐渐融合。更重要的是,许多
公司越来越清楚地意识到移动解决方案能够带来很高的效率和新的商业机会。消费者也开始在
日常生活中使用各种移动设备。移动设备硬件,特别是各种新式的 Pocket PC,正在引领时尚
潮流,不断满足企业用户和消费者的需要。将各种事物紧密联系的关键是:新的软件和开发工
具。
在过去几年中,我使用了Visual Studio .NET、Smart Device Extensions 和SQL Server
™CE 2.0。将这些软件组件应用到各种 Pocket PC(如 Pocket PC Phone Edition)上,不但提
高了开发效率,而且还促进了许多新的移动应用程序的开发。
Windows Phone 移动应用数据库开发主要分为在线和离线数据库两种访问方式。从开发
角度来说,离线数据库就是本地数据库就是把数据库放在本地,不需要连接网络应用程序就可
以访问手机上的数据库中的数据;在线数据库就是在远程机房的应用服务器上搭建系统数据库,
手机终端应用程序通过Web Service 接口来访问远程服务器上的数据。
Windows Phone 手机终端数据访问网络拓扑图结构如下:
专线
路由接入区安全保护区
笔记本
移动终端
无线APN专线
无线APN专线
PDA终端
安全TF卡
安全SIM卡
防火墙
应用服务区
USB专用加密卡
数字证书
USB KEY
安全认证
管理系统
(含RA与认证服务)
手机
GPRS/CDMA
安全接入系统
移动应用
服务器
维护终端
手机
短消息
安全接入系统
IP安全接入系统
交换机
CA数字
证书系统
运营商
APN网络
Windows Phone数据访问链路
便携式电脑
Windows Phone 手机应用程序在线数据库访问简单说明如下:
第一步、在移动应用服务器上安装SQLSERVER 或者ORACLE 数据库,并创建数据库和表
以及添加测试数据等。
第二步、开发Web Service 服务程序,发布并部署至移动应用服务器。
第三步、新建Windows Phone 手机应用程序,添加Web 引用,调用移动应用服务器上的
Web Service 数据接口在手机终端界面实现对远程数据库服务器上数据的管理功能。
Windows Phone 手机应用程序离线数据库主要包括:SQLCE 和SQLite。
SQLServerCE(SQLCE)是一款轻量级本地数据库引擎,为移动设备上偶尔连接的数据访问提
供了解决方案。例如,工商管理人员在执行巡查任务前,可以用Windows Phone 移动设备把台式
计算机中的数据库(SQLServer)拷到Windows Phone 的数据库(SQLCE)上;在执行任务时,可以在
移动设备上修改记录;完成任务后,可以把移动设备上的数据库上传到台式计算机中的数据库,使
这两个数据库之前的数据保持同步。
下面用一个简单事例详细讲解下SQLCE 的基本步骤:
// 当前应用程序工作目录路径
public static string path = @"\Program Files\soft";
//本地数据库连接字符串
5 / 42
public static string SqlceExcue = "Persist Security Info=False;Data Source=" + path + @"\ SOFTDB.sdf;password=";
//sqlce 库路径
public static string SqlceExcueDB = path + @"\SOFTDB.sdf";
第一步、创建SOFTDB.sdf数据库
/// <summar y>
/// 生成数据库
/// </summary>
/// <returns></returns>
private bool createSqlCeDB()
{
// 确定数据库存在,如果新数据库被建立了就返回true,否则返回false。
if (File.Exists(Constant.SqlceExcueDB))
File.Delete(Constant.SqlceExcueDB);
if (File.Exists(Constant.SqlceExcueDB) == false)
{
SqlCeEngine engine = new SqlCeEngine(Constant.SqlceExcue);
engine.CreateDatabase();
engine.Dispose();
return true;
}
else
{
return false;
}
}
第二步、创建数据表EMERGENCYINFO
StringBuilder TSql = new StringBuilder();
TSql.Append("CREATE TABLE [EMERGENCYINFO] (");
TSql.Append(" [ID] [numeric](20, 0) NOT NULL ,");
TSql.Append(" [EMGID] [nchar] (20) NULL ,");
TSql.Append(" [OCCURTIME] [nchar] (20) NULL ,");
TSql.Append(" [EXPLAIN] [nchar] (300) NULL ,");
TSql.Append(" [TYPENAME] [nchar] (2) NULL ,");
TSql.Append(" [REPORTGJJ] [nchar] (2) NULL ,");
TSql.Append(" [REPORTSJJB] [nchar] (2) NULL ");
TSql.Append(" ) ");
SqlCeConnection conn = new SqlCeConnection(Constant.SqlceExcue);
try
{
conn.Open();
SqlCeCommand sqlCreateTable = conn.CreateCommand();
sqlCreateTable.CommandText = TSql.ToString();
sqlCreateTable.ExecuteNonQuery();
}
catch (SqlCeException Exte)
{
}
finally
{
conn.Close();
}
第三步、往表EMERGENCYINFO插入数据
要把远程服务器的数据推送到手机终端方式很多,为了能够更多元化的实现数据同步功能,
6 / 42
这里采用Web Service数据接口直接从远程服务器获取SQLSERVER或者ORACLE数据库的数据集。
/// <summary>
/// 读取指定服务器上的数据库数据
/// </summary>
/// <param name="tableName"></param>
/// <returns>DataSet</returns>
private DataSet getDataSet(string tableName)
{
string strSql = "";
DataSet dst = new DataSet();
try
{
MPP.WebService mws = new MPP.WebService();
mws.Url = Constant.GetWebUrl;
strSql = "select * from " + tableName;
dst = mws.QueryData(strSql, Constant.oracleConnString);
}
catch { }
return dst;
}
//拼插入语句:
ArrayList arr = new ArrayList();
string vals = "";
arr.Add("ID,EMGID,OCCURTIME,EXPLAIN,TYPENAME,REPORTGJJ,REPORTSJJB");
vals = dr["ID"].ToString() + ",'"
+ dr["EMGID"].ToString() + "','"
+ dr["OCCURTIME"].ToString() + "','"
+ dr["EXPLAIN"].ToString() + "','"
+ dr["TYPENAME"].ToString() + "','"
+ dr["REPORTGJJ"].ToString() + "','"
+ dr["REPORTSJJB"].ToString() + "'";
arr.Add(vals);
//执行新增操作
DataTable dt = dst.Tables[0];
if (dt.Rows.Count == 0) return;
SqlCeConnection conn = new SqlCeConnection(Constant.SqlceExcue);
try
{
conn.Open();
conn.BeginTransaction();
SqlCeCommand sqlCreateTable = conn.CreateCommand();
//导入数据
for (int j = 0; j < dt.Rows.Count; j++)
{
string inssql = "insert into " + tname + "(" + arr[0].ToString() + ") values( " + arr[1].ToString() + ")";
sqlCreateTable.CommandText = inssql;
sqlCreateTable.ExecuteNonQuery();
}
}
catch (Exception ex)
{
}
finally
7 / 42
{
conn.Close();
}
第四步、SQLCE数据库的简单操作语句
/// <summary>
/// 执行SQLCE查询,返回DataSet
/// </summary>
/// <param name="SQL">SQL语句</param>
/// <returns ds>DataSet对象.</returns>
public static DataSet GetDataSet(string sql)
{
using (DataSet dt = new DataSet())
{
SqlCeConnection conn = new SqlCeConnection(Constant.SqlceExcue);
try
{
SqlCeCommand cmd = new SqlCeCommand(sql, conn);
SqlCeDataAdapter adptr = new SqlCeDataAdapter(cmd);
adptr.Fill(dt);
cmd.Dispose();
}
catch (SqlCeException et)
{
}
finally
{
conn.Close();
}
return dt;
}
}
/// <summary>
/// 执行SQLCE的SQL语句,返回是否成功
/// </summary>
/// <param name="SQL">SQL语句</param>
/// <returns ds>bool对象.</returns>
public static bool ExeSqlCe(string sqlString)
{
bool result = false;
SqlCeConnection ssceconn = new SqlCeConnection(Constant.SqlceExcue);
try
{
ssceconn.Open();
SqlCeCommand sqlInsertRow = ssceconn.CreateCommand();
sqlInsertRow.CommandText = sqlString;
sqlInsertRow.ExecuteNonQuery();
ssceconn.Close();
result = true;
}
catch (SqlCeException ext)
{
}
finally
8 / 42
{
ssceconn.Close();
}
return result;
}
/// <summary>
/// 执行SQLCE查询,返回指定行数的DataSet
/// </summary>
/// <param name="SQL">SQL语句</param>
/// <returns ds>DataSet对象.</returns>
public static DataSet GetDataList(string start, string max, string sql, string tableName)
{
using (DataSet dt = new DataSet())
{
SqlCeConnection conn = new SqlCeConnection(Constant.SqlceExcue);
try
{
SqlCeCommand cmd = new SqlCeCommand(sql, conn);
SqlCeDataAdapter adptr = new SqlCeDataAdapter(cmd);
adptr.Fill(dt, Convert.ToInt32(start), Convert.ToInt32(max), tableName);
cmd.Dispose();
}
catch (SqlCeException et)
{
}
finally
{
conn.Close();
}
return dt;
}
}
注:要在手机终端上直接操作SQLCE数据库,手机终端必须安装sqlce30.dev.CHS.ppc.wce4.armv4.CAB,该安装文件可以在VS安装目下找到。
9 / 42
Windows Mobile上使用WINCE自带数据库 (转载自http://database.51cto.com 2009-04-08 09:17 施炯 cnblogs ) 通过数据库,可以方便地存储和检索数据,极大地提高工作效率。在Windows CE .NET 4.2上,自带了一个数据库,具体我们可以参考MSDN上的网页:Microsoft Windows CE .NET 4.2 Database Reference。由于它最多只支持4种排序索引,这种数据库适合存储的数据量较小、数据结构相对简单的情况。它支持的数据类型包括2/4字节有/无符号整数、日期时间、Unicode字符串、CEBLOB、布尔和8字节有符号值。 数据库的主要操作包括以下几个方面: 装配数据库卷:BOOL CeMountDBVol( PCEGUID pceguid, LPWSTR lpszDBVol,DWORD dwFlags); 卸载数据库卷:BOOL CeUnmountDBVol(PCEGUID pceguid); 创建数据库:CEOID CeCreateDatabaseEx( PCEGUID pceguid, CEDBASEINFO *lpCEDBInfo); 打开数据库: HANDLE CeOpenDatabaseEx( PCEGUID pceguid, PCEOID poid,LPWSTR lpszName, CEPROPID propid, DWORD dwFlags,CENOTIFYREQUEST *pReq); 写数据库: CEOID CeWriteRecordProps(HANDLE hDbase, CEOID oidRecord, WORD cPropID, CEPROPVAL *rgPropVal), 读数据库: CEOID CeReadRecordPropsEx( HANDLE hDbase, DWORD dwFlags,LPWORD lpcPropID, CEPROPID *rgPropID, LPBYTE *lplpBuffer,LPDWORD lpcbBuffer, HANDLE hHeap); 删除记录:BOOL CeDeleteRecord(HANDLE hDatabase, CEOID oidRecord); 移动指针:CEOID CeSeekDatabaseEx(HANDLE hDatabase,DWORD dwSeekType, DWORD dwValue, WORD wNumVals, LPDWORD lpdwIndex); 使用方法 1.首先在主对话框的头文件中(这里我们建立了一个基于对话框的工程),我们来声明部分变量,用于存储数据库文件名和数据库名;定义一个数据库表结构;以及人员信息库的字段标识,我们通过MAKELONG宏来组合字段数据库类型和标识。相关代码如下: Code //定义数据库文件名 const LPTSTR DBFILENAME = _T("\\My Documents\\Workerinfo.db");
10 / 42
//定义数据库名 const LPTSTR DBTABLENAME = _T("Worker"); //定义员工数据库表结构 typedef struct{ TCHARszID[10];//子机ID号 TCHARszName[20]; //员工姓名 TCHAR szWorkNum[10]; //工号 TCHAR szDepartment[20]; //部门号 }REC_WORKER,*PREC_WORKER; //定义子机ID号字段标志 #define PID_NOMAKELONG(CEVT_LPWSTR,1) //定义员工姓名字段标志 #define PID_NAMEMAKELONG(CEVT_LPWSTR,2) //定义工号字段标志 #define PID_WorkNumMAKELONG(CEVT_LPWSTR,3) //定义员工部门字段标志 #define PID_DepartmentMAKELONG(CEVT_LPWSTR,4) 2.为主对话框添加三个私有成员变量,用于存储库文件卷标识、数据库句柄以及数据库对象标识。代码片断如下: private: CEGUID m_ceGuid; //存储数据库文件标志 HANDLE m_hDB;//存储数据库句柄 CEOID m_ceOid;//存储数据库对象标志 3.在主对话框中给出装配数据库卷、卸载数据库卷、创建数据库、打开数据库、写数据库、读数据库、关闭数据库等等操作。这里就不罗列了。 实例工程是一个WM6平台上的WINCE数据库,基于对话框的应用程序,程序运行效果如下图所示:
11 / 42
图1:程序运行图 另外,我们可以在设备的“My Documents”目录下,找到“Workerinfo.db”文件,正如我们在头文件中所设置的路径,如下图2所示:
12 / 42
图2:数据库文件的路径
13 / 42
XML on Windows Mobile C#
(转载自http://hi.baidu.com/simliving/blog/item/57d0b98b8a0d0d749f2fb4dc.html)
摘要
Windows Mobile 上的XML 相关类,并利用它们高效地操作XML 文件( 流)
Keywords
.Net Compact Framework, Windows Mobile, XML
两年以前张欣同学曾经做过一期Webcast 谈到了这相关的内容,详见:
http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032328201&EventCategory=3&culture=zh-CN&CountryCode=CN
本文主要涉及一些Webcast 里面没有说到的东西, 关于XML 本身的语法和用法我就不在此赘述了,首先,我们来看一看.NET Compact Framework 的System.XML 这个命名空间下,为我们操作XML 提供了哪些类型支持:
类名
说明
XmlReader
抽象类,提供了快速,单向,只读的读取XML 文件流操作
XmlWriter
抽象类,为生成一个XML 文件流提供了接口
XmlTextReader
继承于XmlReader ,用于格式良好的XML 文本处理
XmlTextWriter
XmlWriter 的一个实现类
XmlNodeReader
公共类,用于处理内存中的XML DOM Tree
XmlNodeWriter
公共类,用于在内存中产生XML DOM Tree
XmlDocument
一个XML DOM Tree 的模板类
呃,先来看那个名字跟其他几个类不太一样的吧:XmlDocument.
XmlDocument 用于把XML 文件加载到内存中间。调用Load() 方法即可将XML 文件作为一个数据树加载到内存。Load() 方法提供了几个重载,你可以通过文件名,任意流,或从XmlReader 继承的类以及System.IO.StreamReader 和TextReader 来Load 。这里需要区别一下的是另一个方法LoadXml() ,它是用来加载Xml 字符串
14 / 42
的,而不是文件!
下面的例子是从XmlTextReader 去Load 一个XML 文件:
XmlDocument xmldoc = new XmlDocument(); XmlTextReader xmlRdr = new XmlTextReader(@""Storage Card"books.xml"); xmlRdr.WhiteSpaceHandling = WhiteSpaceHandling.None; xdoc.Load(xmlRdr);
这里提到了XmlTextReader 这个类,可以说XmlTextReader 是XmlReader 在细粒度控制方面的一个实现。XmlTextReader 包含了当前节点的位置信息。调用它的Read() 方法,讲从文件中读取下一个节点的信息,读取顺序是“ 深度优先” 的。通常,在读取数据之初,我们会调用MoveToContent() 去跳过一些非数据的元素段,直接到达根节点处,调用Skip() 方法会跳过当前界点的所有分节点,这在检索节点的时候可能会用得到,可以跳过一些不必要的子节点而节约一点性能,但是对设备上小规模的XML 文件,这个效果往往不是太明显。不过显然可以理解,这种不需要加载整个文件的单向的读写方式,要比使用XmlDocument 对象要快得多~
说到性能,对于资源有限的设备来说,这显然是不可忽略的一点,在操作XML 的时候,我们也应考虑到这一点,在使用XmlReader 和XmlWriter 的时候,可以使用XmlReaderSettings 和XmlWriterSettings 来调整性能,例如使用IgnoreWhiteSpace 来忽略空白字符,或着使用IgnoreComments 来忽略注释行等等,
另外需要注意的是,如果我们使用XmlReader 来读取的时候要避免使用Schema ,因为在单向读取的时候,Schema 的校验会损失一部分性能,而用DataSet 来读取的时候,尽量使文件包含Schema 来确定表结构,这样读起来会比较快,不需要编译器来为Dataset 创建架构。
从细粒度方面考虑,可以用MoveToAttribute() 来设置XmlReader 的访问点,访问各个属性。例如 :
复制代码 public void ShowAttributes(XmlReader reader) { if (reader.HasAttributes) { Console.WriteLine("Attributes of <" + reader.Name + ">"); for (int i = 0; i < reader.AttributeCount; i++) { reader.MoveToAttribute(i); Console.WriteLine(reader.Name + "::" + reader.Value); } reader.MoveToElement(); //属性访问完毕后让reader返回到元素节点上来
15 / 42
} }
XmlNodeReader 和XmlNodeWriter 对XmlNode 提供了快速非缓存的访问方式,可以直接从Xml 的Stream 获取信息。
好,再来看一个例子
复制代码 <bookstore> <book Section=" XML" PublicationDate="2004" ISBN="0-7645-7077-3"> <title>Beginning XML, 3rd Edition</title> <author> <first-name>David</first-name> <last-name>Hunter</last-name> </author> <price>39.99</price> </book> <book Section=" Java" PublicationDate="2004" ISBN="0-7645-6874-4"> <title>Ivor Horton's Beginning Java 2, JDK 5 Edition</title> <author> <first-name>Ivor</first-name> <last-name>Horton</last-name> </author> <price>49.99</price> </book> <book Section=" Database" PublicationDate="2005" ISBN="0-7645-7950-9"> <title>Beginning MySQL</title> <author> <first-name>Robert</first-name> <last-name>Sheldon</last-name> </author> <author> <first-name>Geoff</first-name> <last-name>Moes</last-name> </author> <price>39.99</price> </book> </bookstore>
1) 使用XmlTextReader
这个XML 文件包含了几本书(book) 的相关信息,书有分元素title ,author ,prize 和属性Section ,PublicationDate ,ISBN 。我现在想做的事情就是把这个XML 文件的内容按照我预定的格式打印出来,并存放到一个output.txt 文本文件里面:
首先,我们定义两个用于读写的reader 和writer ,
XmlTextReader reader = null;
16 / 42
StreamWriter writer = null;
在处理函数里面,首先我们做一个初始化:
writer = newStreamWriter(@""Storage Card"output.txt",false); reader = newXmlTextReader(@""Storage Card"books.xml");
当reader 在读的时候
复制代码 while (reader.Read()) { //XmlNodeType这个枚举让我们方便的对不同类型的节点进行相应的操作 switch (reader.NodeType) { caseXmlNodeType.XmlDeclaration: FormatOutput(writer, reader, "XmlDeclaration"); break; caseXmlNodeType.ProcessingInstruction: FormatOutput(writer, reader, "ProcessingInstruction"); break; caseXmlNodeType.DocumentType: FormatOutput(writer, reader, "DocumentType"); break; caseXmlNodeType.Comment: FormatOutput(writer, reader, "Comment"); break; caseXmlNodeType.Element: FormatOutput(writer, reader, "Element"); break; caseXmlNodeType.Text: FormatOutput(writer, reader, "Text"); break; caseXmlNodeType.Whitespace: break; } }
以下是FormatOutput 函数:
复制代码 private static void FormatOutput(StreamWriter writer, XmlReader reader, String nodeType) { //用tab使输出的层次分明一点 for (int i = 0; i < reader.Depth; i++) { writer.Write('t'); } //这里并没有做过多的判断,但是作为Element的节点并没有Value if (reader.Name != String.Empty) writer.WriteLine(reader.Prefix + nodeType + "<" + reader.Name +
17 / 42
">:" + reader.Value); else writer.WriteLine(reader.Prefix + nodeType + ": " + reader.Value); // 显示当前节点的属性名和值,同样用tab做了格式控制 while (reader.MoveToNextAttribute()) { for (int i = 0; i < reader.Depth; i++) writer.Write('"t'); writer.WriteLine("Attribute: " + reader.Name + "= " + reader.Value); } }
程序界面;
输出效果 : XmlDeclaration<xml>:version='1.0' Attribute: version= 1. Comment: Some of Wrox books in the book database Element<bookstore>: Element<book>: Attribute: Section= XML Attribute: PublicationDate= 2004 Attribute: ISBN= 0-7645-7077-3 Element<title>: Text: Beginning XML, 3rd Edition Element<author>: Element<first-name>: Text: David Element<last-name>: Text: Hunter
18 / 42
Element<price>: Text: 39.99 Element<book>: Attribute: Section= Java Attribute: PublicationDate= 2004 Attribute: ISBN= 0-7645-6874-4 Element<title>: Text: Ivor Horton's Beginning Java 2, JDK 5 Edition Element<author>: Element<first-name>: Text: Ivor Element<last-name>: Text: Horton Element<price>: Text: 49.99 Element<book>: Attribute: Section= Database Attribute: PublicationDate= 2005 Attribute: ISBN= 0-7645-7950-9 Element<title>: Text: Beginning MySQL Element<author>: Element<first-name>: Text: Robert Element<last-name>: Text: Sheldon Element<author>: Element<first-name>: Text: Geoff Element<last-name>: Text: Moes Element<price>: Text: 39.99
2) 使用DataSet
跟在PC 机上一样,在面临复杂数据交互,需要充分利用数据间的相互关系的时候,单向运行的XmlReader 就有些不够用了,因为它不保存“ 流过去” 的信息,做过ADO.NET 的人对DataSet 应该不会陌生,跟XmlReader 不同,DataSet 就是一个常驻内存的关系型数据库。DataSet 里面的数据即可以来自关系型数据库又可以来自XML 文件( 流) 。下面的意思演示了如何从DataSet 加载XML 并在DataGrid 上面显示出来:
复制代码 1 DataTable dt1 = null;
19 / 42
2 DataTable dt2 = null; 3 DataSet ds = null; 4 int CurrentTable ; 5 public Form2() 6 { 7 InitializeComponent(); 8 } 9 10 private void LoadData() 11 { 12 int loadTimeSpan; 13 14 XmlDocument doc = new XmlDocument(); 15 try 16 { 17 int t1= System.Environment.TickCount; 18 //将XML文件读入内存 19 doc.Load(@"\Storage Card\books.xml"); 20 int t2 = System.Environment.TickCount; 21 loadTimeSpan = t2 - t1; 22 MessageBox.Show("LoadDocTimeSpan:"+loadTimeSpan); 23 } 24 catch (XmlException ex) 25 { 26 MessageBox.Show(ex.Message); 27 return; 28 } 29 Cursor.Current = Cursors.WaitCursor; 30 //通过XmlNodeReader把XmlDocument中的数据填充到dataSet中去 31 XmlNodeReader reader = new XmlNodeReader(doc); 32 int DataSetFillSpan; 33 ds = new DataSet(); 34 int t3 = System.Environment.TickCount; 35 ds.ReadXml(reader); 36 int t4 = System.Environment.TickCount; 37 DataSetFillSpan = t4 - t3; 38 reader.Close(); 39 40 //因为XML文件里面存在Book和Author的一对多的主从表 41 dt1 = ds.Tables[0]; 42 dt2 = ds.Tables[1]; 43 //设置默认显示的表 44 DG_Book.DataSource = ds.Tables[0].DefaultView; 45 CurrentTable = 0; 46 Cursor.Current = Cursors.Default; 47 MessageBox.Show("Fill dataset timeSpan:"+DataSetFillSpan); 48 } 49 50 private void Form2_Load(object sender, EventArgs e) 51 { 52 LoadData(); 53 } 54 55 /// <summary> 56 /// 显示特定行的信息
20 / 42
57 /// </summary> 58 /// <param name="bookIndex">行号</param> 59 private void DisplayDataRow(int bookIndex) 60 { 61 String line = String.Empty; 62 DataTable dt = CurrentTable == 0 ? dt1 : dt2; 63 64 DataRow dr = dt.Rows[bookIndex]; 65 66 int col = 0; 67 foreach (object value in dr.ItemArray) 68 { 69 line += (dt.Columns[col].ColumnName + ": " + 70 value.ToString() + "\r\n"); 71 col++; 72 } 73 MessageBox.Show(line); 74 } 75 76 private void menuItem3_Click(object sender, EventArgs e) 77 { 78 int bookIndex = DG_Book.CurrentRowIndex; 79 DisplayDataRow(bookIndex); 80 } 81 82 private void menuItem4_Click(object sender, EventArgs e) 83 { 84 SwitchTable(); 85 } 86 87 private void menuItem5_Click(object sender, EventArgs e) 88 { 89 SwitchTable(); 90 } 91 92 /// <summary> 93 /// 在两个表之间切换显示 94 /// </summary> 95 private void SwitchTable() 96 { 97 if (CurrentTable == 0) 98 { 99 DG_Book.DataSource = dt2.DefaultView; 100 CurrentTable = 1; 101 this.Text = "Author Table:"; 102 } 103 else 104 { 105 DG_Book.DataSource = dt1.DefaultView; 106 CurrentTable = 0; 107 this.Text = "Book Table:"; 108 } 109 } 110 111 private void menuItem1_Click(object sender, EventArgs e) 112 {
21 / 42
113 //关闭的时候输出带Schema的XML文件 114 if (ds != null) 115 { 116 ds.WriteXml(@"\Storage Card\bookstore.xml", XmlWriteMode.WriteSchema); 117 //ds.WriteXmlSchema(@"\Storage Card\bookstore.xsd"); 118 } 119 Application.Exit(); 120 }
程序效果:
最后有一点是要强调的是,在使用DataSet 的时候,一定要考虑的数据量的大小,可能超过2K 以上的数据加载的时候速度就有点不能忍受了。我在模拟器上测试用的不到1k 的数据生成XmlDocument 用了1.5 秒,填充DataSet 用了8 秒多,当然在设备上还是要比这快一些。
22 / 42
关于如何在PPC模拟器中读取本地XML文件的办法
(转载自http://www.cnblogs.com/longqi293/archive/2008/11/03/1325121.html) 最近本人在练习使用ppc读取xml文档时遇到一个不大不小的问题,就是在ppc模拟器上,如果不经过如下设置,是不能正确访问本地的文件的,总是提示出错,在此写出经验心得,以便大家不被这个问题困扰了。 1、 首先,我们准备一个xml文件,放到“我的文档”中,然后——〉打开模拟器——〉File——〉configuration——〉shared Fold——〉选择“我的文档”(这里可随便)。 经过第一步之后,在模拟器里,共享的这个文件夹就变成存储卡了,也即此文件夹的地址是storage Card了。 2、然后,新建一个智能设备项目(我在这里是Windows Mobile 6),设计如下界面:
23 / 42
然后,从工具栏拖入一个OpenFileDialog控件,之后双击OpenFile按钮,进入代码编写。 1、 代码如下: private void menuItem2_Click(object sender, EventArgs e) { openFileDialog1.ShowDialog(); try { string file = openFileDialog1.FileName.ToString();//从openFileDialog中读取xml文档 StreamReader sr = new StreamReader(file); XmlTextReader xtr = new XmlTextReader(sr); while (xtr.Read()) { listBox1.Items.Add("NodeType:" + xtr.NodeType.ToString());//为了验证是否读取而写的,可根据实际情况更改 } MessageBox.Show(file); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } 运行后的图象如下:
24 / 42
打开文件 我的xml文件是test1.xml,选中后出现下图
25 / 42
同时显示该文件的路径,可以看到,是”Storage Card”。 至此,我们完成了读取本地xml文件的操作。
26 / 42
设置 Windows 窗体 DataGridView 控件中的数据格式
(转载自http://msdn.microsoft.com/zh-cn/library/f9x2790s(v=VS.90).aspx)
下面的过程演示如何使用 DataGridView 控件的 DefaultCellStyle 属性设置单元格值的基本格式,以及如何设置控件中特定列的基本格式。有关数据的高级格式设置的信息,请参见 如何:自定义 Windows 窗体 DataGridView 控件中的数据格式设置。
设置货币和日期值的格式
•设置 DataGridViewCellStyle 的 Format 属性。下面的代码示例使用列的 DefaultCellStyle 属性设置特定列的格式。 UnitPrice 列中的值以特定于当前区域性的货币格式显示(负值用括号括起来)。 ShipDate 列中的值以特定于当前区域性的短日期格式显示。有关 Format 值的更多信息,请参见格式化类型。
this.dataGridView1.Columns["UnitPrice"].DefaultCellStyle.Format = "c";
this.dataGridView1.Columns["ShipDate"].DefaultCellStyle.Format = "d";
自定义 null 数据库值的显示
•设置 DataGridViewCellStyle 的 NullValue 属性。下面的代码示例使用 DataGridView.DefaultCellStyle 属性在所有包含等于 DBNull.Value 的值的单元格中显示“没有项”。
this.dataGridView1.DefaultCellStyle.NullValue = "no entry";
在基于文本的单元格中启用换行
•将 DataGridViewCellStyle 的 WrapMode 属性设置为 DataGridViewTriState 枚举值之一。下面的代码示例使用 DataGridView.DefaultCellStyle 属性设置整个控件的换行模式。
this.dataGridView1.DefaultCellStyle.WrapMode =
DataGridViewTriState.True;
指定 DataGridView 单元格的文本对齐方式
•将 DataGridViewCellStyle 的 Alignment 属性设置为 DataGridViewContentAlignment 枚举值之一。下面的代码示例使用列的 DefaultCellStyle 属性设置特定列的对齐方式。
this.dataGridView1.Columns["CustomerName"].DefaultCellStyle
.Alignment = DataGridViewContentAlignment.MiddleRight;
示例
--------------------------------------------------------------------------------
private void SetFormatting()
{
this.dataGridView1.Columns["UnitPrice"].DefaultCellStyle.Format = "c";
this.dataGridView1.Columns["ShipDate"].DefaultCellStyle.Format = "d";
27 / 42
this.dataGridView1.Columns["CustomerName"].DefaultCellStyle
.Alignment = DataGridViewContentAlignment.MiddleRight;
this.dataGridView1.DefaultCellStyle.NullValue = "no entry";
this.dataGridView1.DefaultCellStyle.WrapMode =
DataGridViewTriState.True;
}
编译代码
--------------------------------------------------------------------------------
这些示例要求:
•一个名为 dataGridView1 的 DataGridView 控件,该控件包含名为 UnitPrice 的列、名为 ShipDate 的列和名为 CustomerName 的列。
•对 System、System.Drawing 和 System.Windows.Forms 程序集的引用。
可靠编程
--------------------------------------------------------------------------------
为了获得最大可伸缩性,应该在使用相同样式的多个行、列或单元格中共享 DataGridViewCellStyle 对象,而不是单独设置每个元素的样式属性。有关更多信息,请参见 缩放 Windows 窗体 DataGridView 控件的最佳做法。
28 / 42
移动平台数据库开发心得
(转载自:编辑:西安交通大学微软技术俱乐部 黄海鹏 来源: 微软技术俱乐部电子期刊 )
最近在PPC平台下开发了一个软件,在开发过程中对于移动平台下的数据库使用有了一定的心得,小记与此,请高手斧正。
一、引言
PPC 的开发其实与Windows平台下的WinForm开发并没有太大的区别,所使用的开发环境为Microsoft .NET Compact Framework(CF)。.NET Compact Framework(CF)是.NET Framework的子集,其最主要的优点是与.NET Framework类库具有相同的灵活性。同时所有.NET Framework下的类和方法均能在.NET Compact Framework(CF)中使用。因此开发PPC应用程序与开发WinForm程序并没有太大的区别,需要注意的是以下几点:
1.作为.NET Framework的子集,.NET Compact Framework并没有导入所有的引用,因此在使用一些命名空间时会出现问题,比如下面要提到的SqlClient和SqlServerCE。因此在使用前需要查看自己所要使用的命名空间是否已经导入项目中,方法是:在Visual Studio下,打开项目后,点击工具栏的项目?添加引用?点击.NET选项卡,将相应的导入项目即可。
2.使用PPC开发项目,需要使用仿真器,因此需要正确安装仿真器。在Visual Studio 2003下,默认能使用的仿真器只有一个,但是安装了比较完整的网络协议。Visual Studio 2005下能使用的仿真器较多,但却没有安装相应的网络协议,可能是出于安全的考虑,但却给应用开发带来了不便。如果使用PPC环境开发网络应用程序,便需要安装虚拟网卡驱动程序,在微软的官网上可以下载。
3.同时,使用PPC开发网络应用程序,需要使用ActiveSync与仿真器连接,在安装好虚拟网卡驱动程序的前提下,才能使仿真器拥有网络功能。测试仿真器是否连接好的一个简易方法就是用仿真器的IE上一下页面试试~~。当然,用PPC开发网络应用程序所需要配置的内容还远不止如此,有相应需要的可以在网上搜一下相应的内容,也可以和我交流。
二、ADO.NET
使用微软的平台开发数据库应用程序,肯定要使用ADO.NET进行数据处理的,然而在PPC的特殊应用平台下,为了程序运行的速度和效率,微软还提供了另一种截然不同的数据处理方式--SQL Server CE。
1. SQL Server CE 2.0的全名是SQL Server 2000 Windows CE Edition version 2.0,他
29 / 42
伴随着.NET Compact Framework于2002年末推出。作为ACCESS NetFront的替代品,SQL Server CE是一个是运行在Pocket PC以及其他Windows CE平台上的一个很简化的SQL Server 2000/7.0。既可以作为PPC本地数据库程序,也可与远程的SQL Server 2000/2005进行数据更新和同步。
2.在程序开发中使用SQL Server CE的优点是非常明显的,作为一个本地的数据库,可以将远程数据库服务器中的数据库内容下载到本地后,进行本地下的数据库增删改查的操作,在必要时再提交给远程数据库服务器进行更新。其实现本质与ADO.NET的dataset有着一定的一致性,对于远程数据库服务器的压力会有极大的降低和改善。
3.在程序开发中使用SQL Server CE的缺点是:配置SQL Server CE的步骤比较繁琐。使用SQL Server CE连接远程SQL Server数据库时,需要使用IIS服务器通过HTTP或者HTTPS传输协议,因此,需要安装配置好IIS,同时,要求SQL Server数据库配置好本地发布。也就是说,使用SQL Server CE通过RDA(Remote Data Access)与远程SQL Server数据库进行连接,便要求SQL Server数据库和IIS都安装配置无误。但很遗憾的是,能保证这两个麻烦的家伙不出一点问题,并不是一件容易的事情,至少对于初学者而言(本人在配置过2台服务器,其中一台IIS不可用,一台数据库不能用,大概是人品比较差,呵呵)。
4.因此,在开发程序的时候,我们的项目小组选择了另一种数据库处理方式:Sql Client。其实,Sql Client是在WinForm开发以及Web开发中使用最普遍的ADO.NET方法。作为.NET Framework的子集,.NET Compact Framework同样支持.NET Framework下的Sql Client――在项目小组为配置SQL Server CE服务器而头疼的时候,Sql Client方法为我们提供了另一条解决之路,虽然这并不是很好的解决方案。
5.与SQL Server CE不同,Sql Client的数据库并不能保存与PPC中,换句话说,在PPC中使用SQL Client之是与远程的服务器进行数据传输和交换,因此对于网络的要求比较高,移动设备网络速率较低的现状下,方案是否可行还需要一定的测试。同样的,对于服务器的压力也相对较大――只是相对而言,Web应用对于服务器要求与之相仿。
6.无论是SQL Client还是SQL Server CE,在编程时总会出现各种各样的错误。因此,在必要的位置使用try{}catch{}语句时非常必要的,提一个初学者易犯的错误,在使用catch 时,不应该使用Exception异常类,而应该使用SqlException异常类,前者对于Sql操作异常只会给出SqlException的提示,而后者能给出详细而具体的异常提示,为你调试程序提供良好的帮助。
7.最后,说点别的。对于一个项目而言,正确的模块划分和任务分工是非常重要的,对于项目开发中遇到的问题,急着去问别人是不应该的,也是不礼貌的, Google,MSDN,CSDN等地方都是我们寻找答案的最佳场所。对于一个技术人员而言,个人并不仅仅体现在掌握的知识上,同样体现在他对于陌生问题的处理能力上。如何快速的为自己所不了解的问题提供解决方案,是所有
30 / 42
技术开发人员的必修课。项目开发是快乐的,希望大家能多多的与我分享项目开发的经验和乐趣。
31 / 42
用SQL Anywhere创建Windows Mobile数据库
(转载自http://news.newhua.com/news1/program_database/2009/217/092171436781DKJ639595GDDC2HE4812FDKE25356659C231IKCB6AJ.html)
SQL Anywhere是一套完整的数据库应用和服务器,它可以运行在很多平台上,包括Windows Mobile。使用Visual Studio开发者可以开发运行在Windows Mobile设备上的数据库应用。
当为移动设备做开发时,我曾遇到的最大的问题之一是数据存储。这里有两个问题,第一:我经常跟使用SQL数据库的服务器同步化;第二:由于许多设备不能天然地支持SQL(Android平台除外,因为它有SQLite),所以我希望在我的移动应用中使用与之相关的数据库。
大概一年前,我开始在我的另一个项目中使用Sybase的SQL Anywhere产品,这玩意给我留下了很深的印象。SQL Anywhere实际上是一套工具,内含有几个桌面版本,还有一个运行在Windows Mobile上的版本。除此之外还有一个Ultralite版本,可以运行在小一点的Windows CE设备和Palm OS上;还有Ultralite J版本——J是代表Java,它可以运行在BlackBerry和J2SE(Java 2 Platform Standard Edition)上。
Windows Mobile版本最酷的一点是,开发者在运行Windows Mobile的移动设备上可以通过SQL拥有完全相关的数据库存取。使用者完全可以在移动设备上存储列表,然后在服务器上与之同步。对我们来说,这确实是我们想要的功能。
Sybase最近发布了SQL Anywhere.的version 11。本文我将介绍在Windows Mobile 6设备上(尤其是一个升级到Windows Mobile 6的HTC/AT&T 8525)配置SQL Anywhere。
Sybase是谁?
大概半年前,我跟我的一个朋友聊天时提到我正在试用Sybase的一个产品,他很惊奇地问道“Sybase?他们没什么进步啊。”的确如此,但是尽管他看起来在数据库领域已经落后于像Oracle、Microsoft SQL Server之类的竞争对手,但Sybase仍然是个很强的角色。
我所说的这款产品——SQL Anywhere,出自Sybase的一个名为iAnywhere的子公司,iAnywhere成立于2000年五月,至今已推出了多套产品。
SQL Anywhere还包含了一个免费的Developer版本,本文我也用到了。
Windows Version and Windows Mobile Edition
为了使用Windows Mobile版本,开发者实际需要安装整个SQL Anywhere的Windows桌面版本,然后在Windows Mobile上安装Windows Mobile edition。
整个Windows version包括一套开发工具、一个运行在Windows Mobile的.NET组装。开发者可以在熟悉的Visual Studio环境中使用c#。
几个小问题
之前我的电脑曾安装了Visual Studio 2008,但是SQL Anywhere安装器需要Visual Studio的
32 / 42
2005版本做一些附加安装。而且由于我习惯地将恼人的Vista User Account Control关闭,上周我暂时开了下却忘记关了。当Visual Studio安装的时候,我不断地收到提示告诉我应当在管理员权限下运行。而且由于SQL Anywhere安装器自动启动Visual Studio,我无法控制。(今年晚些时候,SQL Anywhere的README文件谈到了在Visual Studio 2008的情况下如何处理。很显然,SQL Anywhere安装器是在Visual Studio 2008之前发布的。看来Sybase应当修复这个问题了。)
我遇到的另一个问题是文档。SQL Anywhere的文档是可用的,但是需要单独下载,这需要你登陆其公司的官方网页然后使用用户名和密码登陆。虽然注册是免费的,但从软件的使用性来说这仍是个不小的麻烦。这里你必须这么做:安装软件后会打开README,然后滚动到相应位置找到Documentation,将链接复制到网络浏览器,下载后安装。这里,开发者应该指向:C:\Program Files\SQL Anywhere 11\Documentation\en\HTMLHelp 然后打开sqlanywhere_en11.chm 文件。当开发者终于做完这些的时候,会发现好几个“Getting Started”文档。
将SQL Anywhere配置到我的Windows Mobile设备也是个麻烦事,同样的也不是功能问题而是不知道怎么怎么做,不过通过Sybase网站的论坛我迅速地解决好了。在目录:C:\Program Files\SQL Anywhere 11\CE\Deployment ,里面有一个程序叫做cedeploy.exe。(我不知道它是什么,在Google上搜索“cedeploy.exe”只得到七页结果,而且没有官方的。幸而这个问题只是一时的问题,知道怎么解决就可以了)
在移动设备上的配置实际上很流畅。有一个公用的CAB文件,我拷贝到了我的设备上,运行这个文件,就可以顺利地安装软件了。
Building in Visual Studio
如果你熟悉创建数据库应用,那么用Visual Studio为Windows Mobile应用创建SQL Anywhere就很简单。我个人是创建在:C:\Users\Public\Documents\SQL Anywhere 11\Samples\SQLAnywhere\CE\ado_net_sample。
这个例子演示了iAnywhere.Data.SQLAnywhere的名字空间(namespace),它包含了.NET数据库开发常用的几种类,例如,名字空间包含SAConnection, SADataAdapter,和SADataReader等类。如果开发者曾在.NET上做过数据库开发,会明显到看到这些类和重用数据库类的区别。
除此之外,开发者可以使用数据边界(data-bound)的控制如DataGrid,换言之,如果你有了基础,在Windows Mobile设备上使用SQL Anywhere不需要学习太多。
构建实例应用很顺利,由于我使用的是Visual Studio 2008,Visual Studio会因为SQL Anywhere需要的是Visual Studio 2005而做转换,不过这种转换也很顺利。
我编译了这个项目没有发现任何错误。我试着在仿真器上运行,但由于libraries不在仿真器上所以发现了许多runtime错误。坦白说,我不确定这些问题是因为SQL Anywhere在安装时要求的是Visual Studio 2005而我用的是2008,还是因为其他问题。但是除了对此问题的追根问底,我决定直接在现实的设备上运行。过去,我发现在现实的设备上运行和在仿真器上运行没有什么区别,所以有时我直接跳过仿真器这一步。
我没有采用在Visual Studio上使用配置,我直接在存储卡上的Windows Mobile复制了执行程序。在设备上,我从文档管理程序运行执行程序并运行顺利。
33 / 42
我点击“connect”按钮,出现错误显示无法链接到数据库,想起来了,因为我没有启动服务器,我的错。所以我关了应用,到SQL Anywhere目录下启动服务器。服务器相当配合,我点击按键来浏览样例数据库,为数据库提供链接名,并最终运行。从数据库的启动服务器提供一个小的控制台显示log信息,到最终结束这个控制台显示数据库一切就绪听候差遣.
34 / 42
用Sybase移动数据库开发CRM系统几个关键问题的技术实现
(转载自http://bbs.chinaunix.net/viewthread.php?tid=1011725)
应用介绍:汽车移动销售,就是销售人员通过移动设备,如PDA、智能手机,将销售应用系统安装于移动设备上,实现移动办公、移动销售,移动设备通过GPRS等无线网络与销售中心进行联系,销售所需要的各种信息可以根据需要下载到移动设备上,销售人员收集的客户信息、销售订单信息等可以根据需要上传到销售中心。
开发环境:
数据库:SQL Anywhere 9
开发工具:SYBASE PocketBuilder 2.0
模拟环境:Microsoft Windows Mobile 5.0 MSFP Emulator Images
模拟平台:Pocket PC 2003 SE 仿真程序
问题1:如何实现模糊查询、同音字查询?比如知春路写成支椿路的话照样能够检索出来怎么实现。
分析:我们在查询信息时(如按某一人名查询、按某一地名查询),经常会遇到只知道发音不知道具体是哪个汉字的情况,为此我们提供同音字的模糊查询,可大大方便用户的查询,只要输入相同拼音的汉字,即可查出某信息(如人员姓名、单位地址等)。为实现此功能,数据库中除存储汉字信息外,还自动存储汉字对应的汉语拼音信息(不用人工处理,通过数据库中的触发器自动完成)。这样在查询时,通过数据库的自定义函数取得汉字所对应的汉语拼音,再与数据库中存储的汉语拼音信息相匹配进行检索。
具体实现关键代码:
1.客户模糊查询(可输入客户名称、客户地址进行同音字的查询)
string cname,cmobile,caddress,thissql,cnamecode,caddresscode
cname=string(trim(sle_name.text))
cmobile=string(sle_mobile.text)
caddress=string(trim(sle_address.text))
//通过函数取得汉字对应的汉语拼音
cnamecode=f_pinyin(cname)
caddresscode=f_pinyin(caddress)
thissql="(1=1)"
if rb_1.checked then //如果选择“同音字模糊查询”
if len(cname)<>0 then
thissql=thissql+" and (customer_customername_pinyin like '" + cnamecode +"')"
end if
if len(cmobile)<>0 then
thissql=thissql + " and (customer_mobile like '" + cmobile +"')"
end if
if len(caddress)<>0 then
thissql=thissql + " and (customer_address_pinyin like '"+ caddresscode +"')"
end if
//精确查询
elseif rb_2.checked then
if len(cname)<>0 then
thissql=thissql+" and (customer_customername_pinyin like '%" + cnamecode +"%')"
end if
35 / 42
if len(cmobile)<>0 then
thissql=thissql + " and (customer_mobile like '%" + cmobile +"%')"
end if
if len(caddress)<>0 then
thissql=thissql + " and (customer_address_pinyin like '%"+ caddresscode +"%')"
end if
end if
//模糊查询
tab_1.tabpage_3.dw_1.settransobject(sqlca)
tab_1.tabpage_3.dw_1.setfilter(thissql)
//tab_1.tabpage_3.dw_1.setfilter( "customer_customer_id=customer_customer_id[1]")
tab_1.tabpage_3.dw_1.filter( )
//today
string stoday = String(now(),"yyyymmdd")
tab_1.tabpage_3.dw_1.retrieve(stoday)
if tab_1.tabpage_3.dw_1.rowcount()=0 then
messagebox("系统提示","没有符合条件的记录")
sle_name.text=""
sle_mobile.text=""
sle_address.text=""
return
end if
tab_1.selecttab(3)
2、 取汉字所对应的汉语拼音的函数
integer li_len,li_loc
string ls_hz,ls_py_code,ls_output
li_loc=1
ls_output=''
li_len=len(inputstring)
ls_output=''
do while li_len > 0
ls_hz=mid(inputstring,li_loc,1)
//从数据库读取汉字所对应的汉语拼音
select trim(pinyin) into :ls_py_code from char_pinyincode where hanzi_char=:ls_hz order by pinyin;
if isnull(ls_py_code) then
ls_py_code=''
end if
if ls_py_code='' then
ls_output=ls_output+"_"+ls_hz
else
ls_output=ls_output+"_"+ls_py_code
end if
li_len=li_len - 1
li_loc=li_loc + 1
loop
if mid(ls_output,1,1)='_' then
ls_output=right(ls_output,len(ls_output)-1)
end if
li_len=len(ls_output)
return ls_output
36 / 42
问题2:如何实现图片的动态存储?如从数据库读取图片内容并显示到图片控件中
分析:将图片的内容存储在数据库中,在需要浏览图片时,从数据库中读取图片信息直接显示在图片中。这样做的好处是,方便对图片资源的备份(随数据库的备份一块进行),图片不占用额外的存储空间;若将图片存储在磁盘上,会由于存储路径发生变化而找不到图片资源,通过数据库存储就避免了该问题。
具体实现关键代码:
selectblob car_pic_total into :photo from auto_stock
WHERE (car_brand like :carbrand) AND (car_type like :cartype) AND (car_color like :carcolor)
using sqlca;
if not isnull(photo) then
//将二进制内容与图片控件相关联
tab_stock.tabpage_2.p_2.setpicture(photo)
end if
问题3、如何实现手持设备与服务器的数据同步?
分析:通过 MobiLink 来实现手持设备与服务器的数据同步。由于开始时设置信息考虑不全面,在某些设备上不能成功与服务器进行数据进行。后经过程序完善,可以实现在各种手持设备与服务器的数据同步。
具体实现关键代码:
string cmd, path
string exe_name
string connect_string, other_arguments
long rc, idx
// ASA key
if -1 = RegistryGet(ASA_REGPATH, "Location", path) then
MessageBox("Error", "Cannot find ASA path.")
return -1
end if
// append "\win32" to path if running on desktop
if iEnv.ostype = windowsnt! then
path = path + "\win32"
connect_string = " -c ~"dsn=" + is_desktop_dsn +"~""
else
connect_string = " -c ~"dsn=" + is_ce_dsn +"~""
end if
exe_name = path + "\dbmlsync.exe"
uf_generate_sync_class_name()
if NOT IsNull(is_quiet) and Len(is_quiet) > 0 then
other_arguments = " " + is_quiet
else
other_arguments = ""
end if
if NOT IsNull(is_logging) and Len(is_logging) > 0 then
other_arguments += is_logging
end if
other_arguments += " -k "
if NOT IsNull(is_additional_args) and Len(is_additional_args) > 0 then
other_arguments += is_additional_args
end if
37 / 42
if NOT IsNull(is_extended_args) and Len(is_extended_args) > 0 then
other_arguments += ' -e ~"' + is_extended_args + '~"'
end if
integer iPos
iPos=pos(lower(connect_string),"dsn=filedsn=")
if iPos > 0 then
connect_string=left(connect_string,iPos -1 )+right(connect_string,len(connect_string) - iPos -4 +1)
end if
//通过调用数据同步组件的方法,进行数据同步,
rc = pb_run_dbmlsync(exe_name, is_publication_name, is_mluser, is_mlpassword, connect_string, other_arguments, is_sync_class_name )
return rc
以上是我们的心血结晶,无偿与各位分享,只希望多些志同道合的朋友,希望与Sybase及iAnywhere产品有兴趣的朋友们多多交流 。
各位大仙们还有什么更好的实现方法,也希望能共同分享、探讨!:)
38 / 42
智能设备开发环境的配置过程
(转载于http://news.e800.com.cn/articles/2008/627/1214531390137_1.html)
现在就来介绍开发SQL Server 2005 Compact Edition移动设备端应用应具备的基本条件吧!通常我们都是使用Visual Studio 2005 Professional及更高的版本进行智能设备程序的开发(Visual Studio 2005 Express目前并不支持)。在安装Visual Studio 2005的过程中,只需要将图1中的“智能设备可编程技术”单选框选中,安装完毕后就可以利用Visual C#开发托管代码的智能设备程序了。
图1 选择“智能设备可编程技术”
我们在开发特定平台的智能设备程序时,往往需要事先安装相应的SDK(软件开发包)。比如说要开发针对Windows Mobile 6.0的应用程序,就要先安装Windows Mobile 6 SDK,否则Visual Studio 2005是不会出现Windows Mobile 6智能设备开发这个选项的。为此,我们在安装完Visual Studio 2005后,就需要安装ActiveSync软件,这样才能继续完成特定平台的SDK安装,这个先后次序希望大家一定要注意。 ActiveSync可以同时支持PPC和微软智能手机(Smartphone),使用它可以很方便地在PC与PPC或智能手机间进行数据的同步。ActiveSync不仅可以同步文件,电子邮件及日程等,更有着许多额外的功能如同步SMS等。另外,Windows Mobile设备的用户还可以通过连接PC来访问互联网。ActiveSync可以说是PC与移动设备间的一座桥梁。 现在最新的ActiveSync版本为4.5,该软件的中文版可以在该链接下载:http://download.microsoft.com/download/7/e/c/7ecbd388-7fb5-4e3e-b57f-12eaf7eb6136/setup.msi 当ActiveSync安装完毕后,会提示你重新启动计算机才能完成相应的设置。ActiveSync的界面如图2所示:
39 / 42
图2 ActiveSync 4.5简体中文版
前文提到过,当我们需要开发特定平台的Windows Mobile应用程序时,需要安装相应的SDK。在本专题中将采用Windows Mobile 6.0作为开发的平台,因为Windows Mobile 6.0设备的ROM中已经内置了.Net Compact Framework 2.0 SP1和SQL Server 2005 Compact Edition,加上近几个月来中国市场上已经有越来越多的产品采用了Windows Mobile 6.0系统,相信不用多久Windows Mobile 6.0就会取代Windows Mobile 5.0,成为主流的操作系统。当然,在本专题中的所有程序也都可以在无需任何修改的条件下在Windows Mobile 5.0上运行。这是因为Windows Mobile 6.0和Windows Mobile 5.0都是基于Windows CE 5.0的,只不过Windows Mobile 6.0在原来5.0的基础上添加了一些新的特性,例如Vista风格等。 Windows Mobile 6.0的SDK最新版可以包含两个版本,一个是针对Pocket PC和Pocket PC Phone Edition开发的Professional版本,另外一个则是针对Smartphone开发的Standard版本。在本专题中,我们主要是针对Pocket PC Phone Edition这种平台进行开发的,相对与Pocket PC它具备了通话的功能,而且硬件性能较之Smartphone有很大的提高,所以一般条件下安装Windows Mobile 6.0 Professional SDK即可。 Windows Mobile 6.0 Professional SDK的下载地址如下:http://download.microsoft.com/download/f/2/3/f232f773-7edc-4300-be07-d3b76a5b3a91/Windows%20Mobile%206%20Professional%20SDK%20Refresh.msi Windows Mobile 6.0 Standard SDK的下载地址如下: http://download.microsoft.com/download/f/2/3/f232f773-7edc-4300-be07-d3b76a5b3a91/Windows%20Mobile%206%20Standard%20SDK%20Refresh.msi 在Windows Mobile 6.0 Professional SDK安装完毕后,大家可以通过“开始”-“所有程序”-“Windows Mobile 6 SDK”-“Line of Business Extras”-“Mobile Line of Business Solution Accelerator”下载一个类似物流系统的移动行业解决方案,我将在本专题的最后部分对该项目进行详细的分析和讲解。该移动行业讲解方案的部分功能模块如3所示:
40 / 42
图3 “Mobile Line of Business Solution Accelerator”的登录模块和创建新订单模块
你也可以在该链接直接下载“Mobile Line of Business Solution Accelerator”的示例代码:http://download.microsoft.com/download/7/e/6/7e635836-bf36-436b-b8cc-0b16c74ba9b7/MobileLineofBusinessSolutionAccelerator.msi 默认状态下,安装Windows Mobile 6.0 Professional SDK会自动安装Windows Mobile 6.0的英文设备仿真器,而中文的设备仿真器是需要我们单独下载的进行安装的,Windows Mobile 6.0中文仿真器如图4所示。 Windows Mobile 6 Professional 中文镜像的下载地址:http://download.microsoft.com/download/0/1/2/012bfbba-9fe5-4e68-86c9-d434446d97dd/0804/Windows%20Mobile%206%20Professional%20Images%20(CHS).msi Windows Mobile 6 Standard中文镜像的下载地址:http://download.microsoft.com/download/0/1/2/012bfbba-9fe5-4e68-86c9-d434446d97dd/0804/Windows%20Mobile%206%20Standard%20Images%20(CHS).msi
41 / 42
图4 Windows Mobile 6中文仿真器的“今日”界面
当Windows Mobile 6.0 SDK安装完毕后,我们就可以通过Visual Studio 2005来开发针对Windows Mobile 6.0的智能设备程序了。如图5所示,在“智能设备”栏中我们会发现多了“Windows Mobile 6 Professional“这一项,而且通过右侧的模板,我们可以创建五种不同类型的项目。
图5 在Visual Studio 2005中创建Windows Mobile 6.0智能设备程序
接下来我们要安装的是SQL Server 2005 Compact Edition的SDK,该SDK包含用于在台式机上开发和部署应用程序的SQL Server 2005 Compact Edition 运行时(必须安装),而且对于不同类型处理器的移动设备,其对应的SQL Server 2005 Compact Edition组件安装包也是不同的。除此之外,SDK中还包含了的SQL Server 2005 Compact Edition的帮助文档,这大概是当前学习SQL Server 2005 Compact Edition的唯一权威资料了。 在笔者当前写作的阶段,SQL Server 2005 Compact Edition SDK的下载页面依然是无法打开的,这种状况大概已经持续了半年左右。下面我将给出SQL Server 2005 Compact Edition SDK直接下载地址: SQL Server 2005 Compact Edition SDK中文:http://download.microsoft.com/download/0/9/4/094d27fe-8d7f-4b0b-8130-
42 / 42
555ed2c8b366/SSCE31SDK-CHS.msi SQL Server 2005 Compact Edition SDK英文:http://download.microsoft.com/download/e/5/b/e5b19eb6-4141-4dba-a1fb-e95693c1538f/SSCE31SDK-ENU.msi SQL Server 2005 Compact Edition SDK安装完毕后,就可以在其安装目录的“\v3.1\SDK\bin\Desktop”子文件夹中找到一个名为“SQLServerCE31-zh-CHS.msi”的文件,该文件就是用于在台式机上开发和部署应用程序的SQL Server 2005 Compact Edition 运行时。因为使用到SQL Server 2005 Compact Edition的智能设备托管程序需要引用“System.Data.SqlServerCe”命名空间,而该命名空间又是由“System.Data.SqlServerCe.resources.dll “文件提供的,为此必须在计算机上安装SQL Server 2005 Compact Edition 运行时。 “v3.1\SDK\Docs\zh-CHS”子文件夹中的“SSCE31BOL-CHS.msi”文件就是SQL Server 2005 Compact Edition帮助文档,因为其内容非常详细,因此建议安装。在“\v3.1\SDK\bin\wce500”子文件夹中,包含了针对不同类型处理器的SQL Server 2005 Compact Edition组件安装包,如图6所示。至于如何将SQL Server 2005 Compact Edition的各个组件安装到移动设备上,将在下一小节详细介绍。
图6 针对7种不同处理器的SQL Server 2005 Compact Edition组件安装包

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值