MobileDemo -- 我的第一个Mobile开发小项目

 简单的来说,winForm开发下的经验可以几乎不用改动的移植到Mobile开发下来,当然Mobile开发也有她自己的许多丰富的内容及自己的缺陷,这些方面会在以后的文章中提到。

下面把做的第一个Mobile开发小项目的代码贴出来,共享之。

项目功能描述:

1. 做一个Web Service,提供查询远程服务端数据以及将本地修改后的数据提交给远程服务端的功能;
2. Mobile程序调用该Web Service,将远程数据缓存到本地,在本地进行修改,然后一次性提交过去;

要求:不要使用任何Compact Framework提供的RDA或Replication数据同步功能。


实施步骤1:提供所需的Web Service
假定我们的远程数据保存在SQL Server 2005的一个数据库中。
在以下代码中,我定义的Web method既有返回DataSet对象的,也有交错字符串数组的。这两者都可以被很好的序列化和反序列化。


该Web Service使用ASP.NET编写。

ContractedBlock.gif ExpandedBlockStart.gif 以DataTable的形式返回雇员信息表
None.gif[WebMethod(Description = "以DataTable的形式返回雇员信息表")]
None.gif
public DataTable GetEmployeesTable(string connStr)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    DataTable dataTable 
= new DataTable();
InBlock.gif
InBlock.gif    
string sql = "SELECT * FROM Employee";
InBlock.gif    SqlCommand command 
= new SqlCommand(sql);
InBlock.gif
InBlock.gif    
using (SqlConnection conn = new SqlConnection(connStr))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        conn.Open();
InBlock.gif        command.Connection 
= conn;
InBlock.gif
InBlock.gif        SqlDataAdapter dataAdapter 
= new SqlDataAdapter(command);
InBlock.gif        dataAdapter.Fill(dataTable);
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
return dataTable;
ExpandedBlockEnd.gif}


ContractedBlock.gif ExpandedBlockStart.gif 以DataSet的形式返回雇员信息表
None.gif[WebMethod(Description = "以DataSet的形式返回雇员信息表")]
None.gif
public DataSet GetEmployeesSet(string connStr)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    DataSet dataset 
= new DataSet();
InBlock.gif
InBlock.gif    
string sql = "SELECT * FROM Employee";
InBlock.gif    SqlCommand command 
= new SqlCommand(sql);
InBlock.gif
InBlock.gif    
using (SqlConnection conn = new SqlConnection(connStr))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        conn.Open();
InBlock.gif        command.Connection 
= conn;
InBlock.gif
InBlock.gif        SqlDataAdapter dataAdapter 
= new SqlDataAdapter(command);
InBlock.gif        dataAdapter.Fill(dataset);
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
return dataset;
ExpandedBlockEnd.gif}

None.gif
None.gif


ContractedBlock.gif ExpandedBlockStart.gif 以string[][]的形式返回雇员信息表
None.gif[WebMethod(Description = "以string[][]的形式返回雇员信息表")]
None.gif
public string[][] GetEmployeesArrays(string connStr)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
string[][] empsArray;
InBlock.gif
InBlock.gif    DataTable dataTable 
= GetEmployeesTable(connStr);
InBlock.gif    
int numRows = dataTable.Rows.Count;
InBlock.gif    empsArray 
= new string[numRows][];
InBlock.gif
InBlock.gif    
for (int i = 0; i < numRows; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        DataRow row 
= dataTable.Rows[i];
ExpandedSubBlockStart.gifContractedSubBlock.gif        empsArray[i] 
= new string[] dot.gif{ row["Id"].ToString(),
InBlock.gif            row[
"Name"].ToString(),
ExpandedSubBlockEnd.gif            row[
"Address"].ToString()}
;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
return empsArray;
ExpandedBlockEnd.gif}

None.gif
None.gif


ContractedBlock.gif ExpandedBlockStart.gif 将更改后的记录表格提交到雇员信息表中
None.gif[WebMethod(Description = "将更改后的记录表格提交到雇员信息表中")]
None.gif
public void UpdateEmployeesTable(string connStr, DataSet changedDataSet)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
string sql = "UPDATE Employee SET Name=@name, Address=@addr WHERE Id=@id";
InBlock.gif
InBlock.gif    SqlParameter paraId 
= new SqlParameter("@id"null);
InBlock.gif    SqlParameter paraName 
= new SqlParameter("@name"null);
InBlock.gif    SqlParameter paraAddr 
= new SqlParameter("@addr"null);
InBlock.gif
InBlock.gif    SqlCommand command 
= new SqlCommand(sql);
ExpandedSubBlockStart.gifContractedSubBlock.gif    command.Parameters.AddRange(
new SqlParameter[] dot.gif{ paraId, paraName, paraAddr });
InBlock.gif
InBlock.gif    
using (SqlConnection conn = new SqlConnection(connStr))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        conn.Open();
InBlock.gif        command.Connection 
= conn;
InBlock.gif
InBlock.gif        
foreach (DataRow row in changedDataSet.Tables[0].Rows)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            paraId.Value 
= row["Id"];
InBlock.gif            paraName.Value 
= row["Name"];
InBlock.gif            paraAddr.Value 
= row["Address"];
InBlock.gif
InBlock.gif            command.ExecuteNonQuery();
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif


ContractedBlock.gif ExpandedBlockStart.gif 将更改后的记录数组提交到雇员信息表中
None.gif[WebMethod(Description = "将更改后的记录数组提交到雇员信息表中")]
None.gif
public void UpdateEmployeesArray(string connStr, string[][] changedRecords)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
string sql = "UPDATE Employee SET Name=@name, Address=@addr WHERE Id=@id";
InBlock.gif
InBlock.gif    SqlParameter paraId 
= new SqlParameter("@id"null);
InBlock.gif    SqlParameter paraName 
= new SqlParameter("@name"null);
InBlock.gif    SqlParameter paraAddr 
= new SqlParameter("@addr"null);
InBlock.gif
InBlock.gif    SqlCommand command 
= new SqlCommand(sql);
ExpandedSubBlockStart.gifContractedSubBlock.gif    command.Parameters.AddRange(
new SqlParameter[] dot.gif{ paraId, paraName, paraAddr });
InBlock.gif
InBlock.gif    
using (SqlConnection conn = new SqlConnection(connStr))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        conn.Open();
InBlock.gif        command.Connection 
= conn;
InBlock.gif
InBlock.gif        
for (int i = 0; i < changedRecords.Length; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
string[] empRecord = changedRecords[i];
InBlock.gif            paraId.Value 
= empRecord[0];
InBlock.gif            paraName.Value 
= empRecord[1];
InBlock.gif            paraAddr.Value 
= empRecord[2];
InBlock.gif
InBlock.gif            command.ExecuteNonQuery();
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif


鉴于为了减少通过Web Service传递的数据量,我们提供了两种返回值的Web Method,相应的有2种提交更改的方式。

注意在使用数组传递数据时,我为什么不用二维数组,而选择交错数组呢?而且这里的交错数组没一个数组的维数都是相同的。主要是由于如果使用二维数组,在获取维数上很麻烦,如 string[,] empsArr = new string[2, 3],我在使用传递过来的empsArr对象时,如果不额外的传递一个维数参数,我根本就没法知道这个东西是几行的(几列是可以知道的,因为这个是因需要固定的,而行数却是变化的。);采用交错数组可以很方便的获取维数:
string[][] empsArr = new string[][3];
int length = empsArr.Length;

转载于:https://www.cnblogs.com/Peter-Yung/archive/2007/07/16/820176.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jquery mobile的所有版本库api文档简单示例demo下载jqm学习大全下载后评论反积分! jQuery Mobile是jQuery 在手机上和平板设备上的版本。jQuery Mobile 不仅会给主流移动平台带来jQuery核心库,而且会发布一个完整统一的jQuery移动UI框架。支持全球主流的移动平台。jQuery Mobile开发团队说:能开发这个项目,我们非常兴奋。移动Web太需要一个跨浏览器的框架,让开发人员开发出真正的移动Web网站。 今天,jQuery 驱动着 Internet 上的大量网站,在浏览器中提供动态用户体验,促使传统桌面应用程序越来越少。现在,主流移动平台上的浏览器功能都赶上了桌面浏览器,因此 jQuery 团队引入了 jQuery Mobile(或 JQM)。JQM 的使命是向所有主流移动浏览器提供一种统一体验,使整个 Internet 上的内容更加丰富 — 不管使用哪种查看设备。 JQM 的目标是在一个统一的 UI 中交付超级 JavaScript 功能,跨最流行的智能手机和平板电脑设备工作。与 jQuery 一样,JQM 是一个在 Internet 上直接托管、免费可用的开源代码基础。事实上,当 JQM 致力于统一和优化这个代码基时,jQuery 核心库受到了极大关注。这种关注充分说明,移动浏览器技术在极短的时间内取得了多么大的发展。 与 jQuery 核心库一样,您的开发计算机上不需要安装任何东西;只需将各种 *.js 和 *.css 文件直接包含到您的 web 页面中即可。这样,JQM 的功能就好像被放到了您的指尖,供您随时使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值