一个C#WEBSERVICE的问题,期待高手帮忙解决,谢谢

liduoduo 2012-06-03 03:48:02
WEBSERVICE 一个插入数据函数

[WebMethod]
public string InsertData(DataTable dt)
{
SqlConnection conn2 = GetConn();
SqlTransaction t = conn2.BeginTransaction();
SqlCommand Cmd = conn2.CreateCommand();
Cmd.Transaction = t;

try
{
foreach (DataRow dr in dt.Rows)
{

Cmd.Parameters.Clear();
Cmd.CommandText = "insert into productdata(address,customer) Values(@address,@customer)";
Cmd.Parameters.Add(new SqlParameter("@address", dr["address"].ToString()));
Cmd.Parameters.Add(new SqlParameter("@customer", dr["customer"].ToString()));
int intResult=Cmd.ExecuteNonQuery();
}
t.Commit();
}
catch (Exception ext)
{
t.Rollback();
return (ext.Message);
}
finally
{
Cmd.Clone();
conn2.Close();
}
return ("true");
}




客户端调用插入数据:

private void buttonSave_Click(object sender, EventArgs e)
{

前面代码省略...

string strvalue = webservice1.InsertData(dt); //dt为一个有1万条记录的DataTable

if (strvalue == "true")
{
MessageBox.Show("保存成功");
}
else
{
MessageBox.Show(strvalue);
}


}


上面是使用C#调用WEBSERVICE的一个函数InsertData插入数据,如果数据提交出错,程序是会自动回滚的,事务处理我测试过了,可以执行。

但是一旦数据量增多,调用 webservice1.InsertData(dt); 这句命令后,客户端提示超时。但Dt实际已经传输到了服务器端,造成一个
问题就是:客户端提示传输数据超时错误,但是服务器端已经插入数据这样的错误。请问应该如何解决?



...全文
246 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
newjq 2012-07-05
  • 打赏
  • 举报
回复
提供一个思路,仅供参考:

第1步:服务端插入的表增加2列,第1列为客户端调用全局序列号,客户端每次调用InsertData时连同该全局序列号一起插入本表相应行的该列,第2列为标志位!

第2步:服务端增加InsertDataVerify函数,供客户端调用时连同上次全局序列号及行数或总金额等摘要信息供服务端校验,若校验成功,将表对应的该全局序列号所有行第2列标志位设为有效,即该行有效可用,作后续处理!
风吹腚腚凉 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
最重要一点是,如果客户端超时了,服务器端却已经插入数据,那么很难保证服务器端数据的完整性,所以请高手帮忙
[/Quote]
在传送过去的同时设置服务器端的超时时间,然后数据插入完毕后,在将超时时间设置回来。
但是你很难确保到底是超时了还是数据在插入中,所以我建议你每插入一定数量的数据就将等待时间延长一会,
而不是一下次就设置那么长的时间。例如插入100条以后就将相应时间增加5秒或者多少秒的,这样就行了吧?
liduoduo 2012-06-05
  • 打赏
  • 举报
回复
最重要一点是,如果客户端超时了,服务器端却已经插入数据,那么很难保证服务器端数据的完整性,所以请高手帮忙
caoqinghua 2012-06-05
  • 打赏
  • 举报
回复
数据同步,尤其是网络环境复杂的情况下。传输异常很正常。
caoqinghua 2012-06-05
  • 打赏
  • 举报
回复
关于数据同步是否有效的问题。我觉得这个放到客户端或服务器端校验一下。我们原来采取的方法是,如果客户端同步一部分数据失败。下次上传时候将这些数据重新传一次。服务器端接收数据先按主键(省.市.县.乡.医院)delete一次,然后insert。虽然性能有一些损失,但能保证数据的有效性
liduoduo 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 9 楼 的回复:
最重要一点是,如果客户端超时了,服务器端却已经插入数据,那么很难保证服务器端数据的完整性,所以请高手帮忙

在传送过去的同时设置服务器端的超时时间,然后数据插入完毕后,在将超时时间设置回来。
但是你很难确保到底是超时了还是数据在插入中,所以我建议你每插入一定数量的数据就将等待时间延长一会,
而不是一下次就设置那么长的时间。例如插入100条以后就将相应时间增加5……
[/Quote]
这种方法有没有实际操作哦?现在上传数据不只一个人,很可能有很多客户端上传数据的
liduoduo 2012-06-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

如果我说的两种方法都试过了,我建议你降低传输的量。原来做过医疗行业的健康档案上传。也是用webservice实现。每次只传1千条,100多w的数据没多长时间就同步完了。
[/Quote]

如果是网络原因导致超时呢,那么也有可能出现我提的这种情况哦
caoqinghua 2012-06-03
  • 打赏
  • 举报
回复
如果我说的两种方法都试过了,我建议你降低传输的量。原来做过医疗行业的健康档案上传。也是用webservice实现。每次只传1千条,100多w的数据没多长时间就同步完了。
uhonor 2012-06-03
  • 打赏
  • 举报
回复
只能是分段存储
如果对DataTable是否存储成功不关心的话,可以使用线程存储
jdc71264 2012-06-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:
//dt为一个有1万条记录的DataTable
应用环境这个不超时才怪

1.配置iis的超时时间
2.将传递的datatable进行序列化压缩,服务器端解压缩反序列化


这种方法我已经做了。能否有更好的能控制状态的方法?网上有篇文字使用SESSION存储SqlConnection,这个方法理论上可以,但是好像SESSION不是很稳定吧?
[/Quote]
1W条数据,还是不要存到session里面了,那玩意太不稳定了,你是在不行就不要一次性传输那么多了,分段传输吧。session肯定是不稳定的!!!
liduoduo 2012-06-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
//dt为一个有1万条记录的DataTable
应用环境这个不超时才怪

1.配置iis的超时时间
2.将传递的datatable进行序列化压缩,服务器端解压缩反序列化
[/Quote]

这种方法我已经做了。能否有更好的能控制状态的方法?网上有篇文字使用SESSION存储SqlConnection,这个方法理论上可以,但是好像SESSION不是很稳定吧?
caoqinghua 2012-06-03
  • 打赏
  • 举报
回复
//dt为一个有1万条记录的DataTable
应用环境这个不超时才怪

1.配置iis的超时时间
2.将传递的datatable进行序列化压缩,服务器端解压缩反序列化
ycproc 2012-06-03
  • 打赏
  • 举报
回复

你取的数据量是多少?

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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