本技术文档主要是说明了在变电站巡管理检系统项目中用到的WinCE
Windows CE搭建出来的物体就是平台,是适应某种有固定标准的嵌入式设备的操作系统子集,最著名的平台就是Pocket PC了,是提供给没有键盘的掌上电脑使用的平台。由于平台和硬件的一致性,所以有时候也用平台的名称来称呼整个系统——硬件与操作系统的总和。
我们也可以自己开发平台,开发工具是微软提供的Platform Builder,Platform Builder的版本号是和Windows CE的版本号一致的。
更多程序员关心的是应用程序的开发,而应用程序开发是针对特定平台的,我们在开发之前必须安装目标平台的SDK,才能够开发出适应目标平台的开发工具。
初学者另外一个比较糊涂的概念是版本的问题,现在市面上能够见到Windows CE的两代产品,它们的内核分别基于Windows CE 3.0和Windows CE.NET(即4.0)。
微软刚面世的Pocket PC 2003和Smart Phone 2003统称为Windows Mobile 2003,我们大多数时候还是习惯地沿用老称谓。
而市面上经常见到的Pocket PC 2002是基于Windows CE 3.0的平台,而Pocket PC 2003则是基于Windows CE.NET的平台,需要注意的是,Pocket PC 2003的内核是Windows CE.NET 4.2。而SmartPhone2003也是基于Windows CE.NET的。SmartPhone的最初版本是2002,基于Windows CE 3.0的,但是微软没有推出SmartPhone2002的中文版。
Visual Studio.NET针对嵌入式设备开发需要SDE的支持,而VS.NET 2003中包括了SDE,不需要另外安装。Visual Studio.NET开发的程序需要目标平台支持.NET Compact Framework。现在支持.NET Compact Framework的平台有Pocket PC 2002和Pocket PC 2003。这里需要注意的是SmartPhone 2003是不支持.NET Compact Framework的。
手持机(PDA)是:
Symbol
Mc50
Win CE.NET 4.2(
Microsoft? Windows? Mobile 2003
CPU
内存:64MB RAM/ 64MB ROM
扫描器:推入式锁定磁条阅读器
http://ewaytech.com.cn/cpyjs2.asp?setid=93
可以去微软的官方网站下载sql server ce
下载下来后就可以安装了,双击SQL SERVER CE
1
去PDA
注意的是,如果钩选下面的SERVER TOOLS
在安装完SP3
直接考sql server ce
也可以不做任何安装,因为在部署智能设备应用程序到PDA
如何在 PDA上存储数据。从应用程序的角度来看,数据可以保存在关系数据库(例如 Microsoft SQL Server? CE)、本地文件(例如通常通过 DataSets 管理的 XML 文件)以及在应用程序终止时配置的基于会话的内存内数据结构中等,如果要存储在 PDA上的数据量少(少于 50 至 100 kb),则数据可以存储在本地的 XML 文件中。如果数据量较大,则 SQL Server CE 将提供较高的性能及可靠性。原因是,将使用 SQL Server CE 查询引擎访问数据,该查询引擎支持具有更高性能和可管理性的结构查询语言 (SQL),所以我们在变电站巡检管理系统项目里面用SQL SERVER CE
执行QUERY
using System.Data;
using System.Data.SqlServerCe;
private stirng ConnectiongString =”
public DataSet Query(string sql,string ConnectionString)
{
System.Data.SqlServerCe.SqlCeConnection conn=null;//声明一个连接
System.Data.SqlServerCe.SqlCeDataAdapter da=new SqlCeDataAdapter();//新建一个数据适配器
System.Data.DataSet ds=new System.Data.DataSet();//新建一个数据集并给它分配内存地址
try
{
conn=new SqlCeConnection(ConnectionString);//实例化一个连接
conn.Open();//打开连接
da.SelectCommand = new SqlCeCommand(sql, conn);//传入查询语句和连接参数实并实例化
da.Fill(ds);//执行SQL语句并把结果集FILL到DS
return ds;
}
catch(System.Data.SqlServerCe.SqlCeException ec)//捕获异常
{
this.ShowErrors("执行查询失败:"+sql,ec);
throw ec;
}
finally
{
da.Dispose();//关闭数据适配器
conn.Dispose(); //关闭连接
}
}
1.12 执行其它SQL语句
public void Execute(string sql,string ConnectionString)
{
System.Data.SqlServerCe.SqlCeConnection conn=null; //声明一个连接
System.Data.SqlServerCe.SqlCeDataAdapter da = new SqlCeDataAdapter();//声明一个数据适配器并给它分配内存空间
try
{
conn=new SqlCeConnection(ConnectionString); //实例化一个连接
conn.Open();//打开连接
da.SelectCommand = new SqlCeCommand(sql, conn); //传入查询语句和连接参数实并实例化
da.SelectCommand.ExecuteNonQuery();//执行SQL语句返回影响的行数
}
catch(SqlCeException ecc) //捕获异常
{
this.ShowErrors("执行SQL失败:"+sql,ecc);
throw ecc;
}
finally
{
conn.Dispose();
da.Dispose();
}
}
SQL SERVER CE
{
private string Tb_N=”
private string InternetUrl=”
private string LocalConnectionString= “
private string rdaOleDbConnectString=”
SqlCeRemoteDataAccess rda = null;//声明一个远程数据访问变量
try
{
rda = new SqlCeRemoteDataAccess();//实例化并分配内存空间
rda.InternetUrl = InternetUrl;//给RDA的属性付值
rda.LocalConnectionString = LocalConnectionString; //给RDA的属性付值
rda.Pull( //调用RDA的PULL方法
Tb_N,
sql,
rdaOleDbConnectString,
RdaTrackOption.TrackingOn
);
}
catch(SqlCeException es) //捕获异常
{
ShowErrors("同步"+Tb_N+"失败!",es);
rda.Dispose();
throw es;
}
finally
{
rda.Dispose();
}
}
PULL
{
private string Tb_N=”
private string InternetUrl=”
private string LocalConnectionString= “
private string rdaOleDbConnectString=”
SqlCeRemoteDataAccess rda = null;//声明一个远程数据访问变量
try
{
rda = new SqlCeRemoteDataAccess();
rda.InternetUrl = InternetUrl;
rda.LocalConnectionString = LocalConnectionString;
rda.Push(Tb_N,
rdaOleDbConnectString,
RdaBatchOption.BatchingOn
);
}
catch(SqlCeException es)
{
ShowErrors(es);
throw es;
}
finally
{
rda.Dispose();
}
}
上传和下载差不多,只是下栽调用pull方法而上传调用了push方法, push方法最后一个参数是表明是否开启事务控制。
2. Symbol
this.barcodeReader = new Symbol.Barcode.BarcodeReader();//实例化
this.barcodeReader.Decoders.D2OF5 = Symbol.Barcode.DisabledEnabled.Enabled;//声明条码的标准
this.barcodeReader.Reader.ReadNotify+=new EventHandler(Reader_ReadNotify);//绑定扫描条码事件(其实就是给一个特殊的委托变量指定一个方法入口地址)
this.barcodeReader.Start();//打开扫描头
private void Reader_ReadNotify(object sender, EventArgs e)
{
//扫描后要处理的事情
}
要注意的是要打开扫描头(
第1
我们的处理方法是:只有到条码扫描界面才打开扫描头,且设个标记位使关闭扫描头到打开扫描头这个过程不能触发扫描头事件。
Socket
Socket_Listener
PC
Socket
Socket_Client
PDA
USB
Class_PDASocket
包含两个类:
Socket_Listener
Socket_Client
PC
PC
PDA
PDA
PC
之所以PC
PC
在进入“任务管理“界面,socket
当用户在server上点击“任务下载”按钮,server先生成好需要下载的数据表,然后通过全局变量(Stream)向PDA发送“download“命令。
当用户在server上点击“任务上传“,server向PDA发送”Upload“命令,待PDA执行完毕后,server将会处理PDA上传回来的数据。
注意在窗口RW_Form关闭时,记得调用Listener的StopListener方法关闭socket,否则如果异常断开PDA连接,PC上还会有一个线程会阻塞在系统进程中。
PDA端:
PDA端在Form_Load事件中将会启动一个socket通讯线程,专门负责与PDA的通讯。在此线程中,创建一个Socket_Client,通过socket_Client向PC发送socket消息”
注意此线程是个死循环,当系统进程还处于运行状态(ProcessEnd=false),将会一直执行一下操作:
如果连接正常(ConnectOK=true),PDA将会向server发送“WaitingCommand“消息,表明PDA处于等待命令状态,然后线程sleep 2秒钟;
如果连接中断(ConnectOK=false),PDA将会每隔两秒中向server发送“PDA_Ready“消息,如果发送出错,将会屏蔽异常(如果 不屏蔽,PDA程序将会退出),把标志位connectOk保持false;如果收到”Server_Ready“,将会把connectOk置为true;
当PDA收到server的消息(命令),PDA将会解析,如果是“download“,将会执行Download处理,如果是Upload将会执行Upload处理,如果收到”server_Ready“则把标记位”connectOK“=true
现在我们想在DataGrid