【发布时间】:2015-09-29 15:05:04
【问题描述】:
我有一个场景,比如使用 C# 和 VB 通过 WCF 服务将 excel 导入数据库。我正在使用 WCF Basichttpbinding。
工作流程
excel 有 500 条记录。我在服务中有一个插入查询。我正在将 Excel 记录转换为数据集(在 C# 和 VB.Net 中),然后我将相同的数据集传递给服务,以便使用每个语句插入数据库(如果混淆,请告诉我)。在此之后,我试图将插入的记录显示到 UI 中的 gridview(问题来了)。
问题是:
当我上传 Excel 表格时,我收到如下错误,
套接字连接被中止。这可能是由于处理您的消息时出错或远程主机超出接收超时,或者是潜在的网络资源问题造成的。本地套接字超时为 00:09:59.9989999 --->System.Net.Sockets.SocketException: Existing Connection 被远程主机强行关闭 ....
以上错误显示在客户端应用程序(UI)中。但是数据(来自excel)仍然在幕后插入数据库。
我尝试的是:
我已经尝试过以下事情,
- 我尝试在服务 Web 配置文件中增加发送超时(如 00:20:00),然后我在客户端应用程序中反映了相同的文件,但由于值采用默认超时,因此没有任何反应。 (我相信,从 configuration.svcinfo => 在 serializedValue 中,发送超时是 00:10:00)。
- 我尝试增加 maxreceivedMessageSize、maxBufferSize、maxBufferPoolSize,如 [此处] 所述。 (http://www.codeproject.com/Questions/633699/Socket-Exception-WCF)。但是什么也没发生。
注意:当我插入一条记录时,它工作得很好。
另一个障碍是,这发生在我的机器上。但是如果我在我朋友的机器上尝试同样的事情,我可以得到 500 条记录而没有任何错误。
用于插入的 WCF 服务代码:
注意:myds 是保存 Excel 工作表中记录的数据集。
If myds.Tables.Count > 0 Then
If myds.Tables(0).Rows.Count > 0 Then
For Each dr In myds.Tables(0).Rows
InsertNewLog(userid, gno, pnumber)
Next
End If
End If
Private Sub InsertNewLog(userid As String, gno As Int32, pnumber As String)
Dim Oraclecon As New OracleConnection(System.Configuration.ConfigurationManager.AppSettings("ConnectionString"))
Dim transaction As OracleTransaction
Oraclecon.Open()
transaction = Oraclecon.BeginTransaction(IsolationLevel.ReadCommitted)
Dim myCMD As New OracleCommand("insert into Log_table( " & _
" USER_ID, " & _
" GROUP_No, " & _
" PRO_No" ) values (:p_userid,:p_groupno, :p_pronumber)
myCMD.Connection = Oraclecon
Dim p_userid As OracleParameter = New OracleParameter()
p_userid.OracleDbType = OracleDbType.Varchar2
p_userid.Value = userid
myCMD.Parameters.Add(p_userid)
Dim p_groupno As OracleParameter = New OracleParameter()
p_groupno.OracleDbType = OracleDbType.Int32
p_groupno.Value = groupnbr
myCMD.Parameters.Add(p_groupno)
Dim p_pronumber As OracleParameter = New OracleParameter()
p_pronumber.OracleDbType = OracleDbType.Varchar2
p_pronumber.Value = pronumber
myCMD.Parameters.Add(p_pronumber)
Try
myCMD.ExecuteNonQuery()
transaction.Commit()
Catch x
Throw New Exception(x.ToString())
transaction.Rollback()
Exit Sub
Finally
Oraclecon.Close()
Oraclecon.Dispose()
End Try
End Sub
【问题讨论】:
-
启用有助于查明问题的 WCF 跟踪
-
客户端是否必须等待日志运行过程完成,或者您可以异步处理它。
-
@3dd 是的,客户端必须等待进程完成。
-
发布您用于插入数据的代码。很可能你这样做效率低下。没有理由将记录插入 Excel 需要超过 20 分钟。
-
@Ahmedilyas 我没有将数据插入到 Excel 中。我正在将excel数据插入数据库。插入查询很常见,我正在使用它。导入 excel 然后将 excel 转换为数据集(发生在客户端应用程序中)然后我将该数据集传递给具有 Insert 方法的服务(发生在服务端)。
标签: c# asp.net vb.net excel wcf