WCF和DataSet

hotyei 2010-11-09 01:04:47
各位高手请指教:

  定义了这样一个契约,返回一个数据集:
  DataSet GetData(string SQLStr);

  客户端也可以正常地接收对应的数据,但现在问题是客户端所作的修改,怎样提交到数据库上面??
...全文
318 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaobo 2010-12-23
  • 打赏
  • 举报
回复
DataSet.GetChanges()传递到服务端即可!
hotyei 2010-11-19
  • 打赏
  • 举报
回复
谢谢楼上。
lhzyn 2010-11-17
  • 打赏
  • 举报
回复
findcaiyzh所说的类型安全的意思是,已经定义好的有固定的属性或字段的类型,例如他定义的class Contact,
Dataset的不安全就在于,它存储的内容的属性是动态的,某个表可能有可能没有,表里面的字段也是不确定的.
使用Dataset作为DataContract一般都是不得已实在没办法时的选择.
对于这个:
这样的方法固然可行,但如果数据量非常大的情况下(如100000笔记录),如果我仅仅修改了一笔资料,这样会不会出现客户端重新将这100000笔资料重新回传到服务端的情况。如果真是这样,那么速度就会非常的慢。
你应该在程序里做好控制,保证提交的Dataset中都是需要更新的数据.
hotyei 2010-11-10
  • 打赏
  • 举报
回复
谢谢各位!

由于我们使用了用户自定义字段(客户自已向数据库添加一些字段),所以不能使用List<对象类别>的方式将数据传送到客户端,而必须使用DataSet的方式。

还望高手说一下使用DataSet有什么不好,类型安全又是指什么呢?
机器人 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hotyei 的回复:]
上面两位高手,你们好!

通过:
void UpdateDatabase(DataSet _DataSetToUpdate);

这样的方法固然可行,但如果数据量非常大的情况下(如100000笔记录),如果我仅仅修改了一笔资料,这样会不会出现客户端重新将这100000笔资料重新回传到服务端的情况。如果真是这样,那么速度就会非常的慢。
[/Quote]

DataSet里只保存修改的一笔数据。。。
Devillyd 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 findcaiyzh 的回复:]
那就最好别用Dataset了,dataset不是类型安全的。

可以使用这样的
[DataContract(Namespace = "*****", Name = "Contact")]
class Contact
{
[DataMember(Order = 1)]
public int ContactId{get;set;};

[DataMember(Order ……
[/Quote]
宝_爸 2010-11-10
  • 打赏
  • 举报
回复
那就最好别用Dataset了,dataset不是类型安全的。

可以使用这样的
[DataContract(Namespace = "*****", Name = "Contact")]
class Contact
{
[DataMember(Order = 1)]
public int ContactId{get;set;};

[DataMember(Order = 2)]
public string FirstName{get;set;};

[DataMember(Order = 3)]
public string LastName{get;set;};

[DataMember(Order = 4)]
public string Email{get;set;};

}

List<Contact> GetContacts(string SQLStr)
{
}
void UpdateContact(Contact newContact)
{
//根据Id更新数据库。
}

注意:以上代码没有经过编译,可能有些许错误。
潇洒王子 2010-11-10
  • 打赏
  • 举报
回复
直接根据ID修改记录,返回数据库即可,别搞的 太复杂
hotyei 2010-11-09
  • 打赏
  • 举报
回复
上面两位高手,你们好!

通过:
void UpdateDatabase(DataSet _DataSetToUpdate);

这样的方法固然可行,但如果数据量非常大的情况下(如100000笔记录),如果我仅仅修改了一笔资料,这样会不会出现客户端重新将这100000笔资料重新回传到服务端的情况。如果真是这样,那么速度就会非常的慢。
MarcuseXiao 2010-11-09
  • 打赏
  • 举报
回复
可序列化的类型(DataSet,或者自定义的DataContract)都可以作为参数进行调用的,跟类调用一样的
lhzyn 2010-11-09
  • 打赏
  • 举报
回复
客户端既然可以接收DataSet,当然也可以把修改后的DataSet提交到WCFService进行数据库更新啦.
你可以在契约中定义一个方法例如
void UpdateDatabase(DataSet _DataSetToUpdate);
另外
既然使用了WCF,最好不要定义这样的方法DataSet GetData(string SQLStr),把Sql语句传到WCFService执行还不如直连数据库来的直接.
需要下载:Silverlight.DataSet和Silverlight.DataSetConnector 下面是示例: DataTable Dt = new DataTable(); DataColumn col1 = new DataColumn("CompanyName"); Dt.Columns.Add(col1); DataColumn col2 = new DataColumn("Email"); Dt.Columns.Add(col2); DataRow Row = Dt.NewRow(); Row[0] = "杭州市公司"; Row[1] = "TEL110"; Dt.Rows.Add(Row); grid1.DataContext = Dt.GetBindableData(new Connector()); Silverlight与Wcf传递DataTable(以下均指我们下载这个程序集中的DataTable) 由于Silverlight这个程序集中使用的System.dll是C:\Program Files\Reference Assemblies\Microsoft\Framework\Silverlight\v3.0\System.dll(2.0.5.0版本)而不是.net framework中的那个System.dll(2.0.0.0.0版本),所以在Wcf中不能直接使用DataTable,那么如何将DataTable信息从Wcf传递到Silverlight中呢,就是WcfDataSet转成string或byte[]传递到Silverlight然后再将其还原成DataSet,看下面的代码示列: Wcf端: public string GetRecordset(string QuerySql) { DataTable Dt = DbAgent.GetRecordset(QuerySql); DataSet ds = new DataSet(); ds.Tables.Add(Dt); return Silverlight.DataSetConnector.Connector.ToXml(ds); } Silverlight端: void client_GetRecordsetCompleted(object sender, SilverlightApplication1.DbServer.GetRecordsetCompletedEventArgs e) { if (e.Error != null) { MessageBox.Show(e.Error.Message + e.Error.StackTrace); } else { DataSet ds = new DataSet(); ds.FromXml(e.Result); DataContext = ds.Tables[0].GetBindableData(new Connector()); } } 此DataTable中存入的数据不是object类型的,而全是string类型的,如果数据库中存的值为null,那么取出来的值是null而不是DbNull.Value.

12,162

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧