- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 SqlBulkCopy 将一批记录从 MySQL 复制到 SQL Server。
正好 30 秒后,我明白了
System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
The statement has been terminated.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
异常内有一个“Error”对象,其中包含以下详细信息:
Message: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
LineNumber: 0
Source: .Net SqlClient Data Provider
Procedure:
Index #1
Message: The statement has been terminated.
LineNumber: 1
Source: .Net SqlClient Data Provider
Procedure:
这是代码
using (MySqlConnection sourceConnection = new MySqlConnection(AccManConnectionString)) {
sourceConnection.Open();
MySqlCommand commandSourceData = new MySqlCommand(string.Format(sql, VersionNum.ToString()), sourceConnection);
for (int i = 0; i < ParamNames.Length; i++)
{
commandSourceData.Parameters.AddWithValue(ParamNames[i], SetIDList[i]);
}
MySqlDataReader reader = commandSourceData.ExecuteReader();
using (SqlConnection destinationConnection = new SqlConnection(TimetableConnectionString))
{
try
{
destinationConnection.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
{
bulkCopy.DestinationTableName = "NetworkID";
// Configure the batch sizes and timeouts (cofig code omitted)
bulkCopy.BatchSize = batchSize;
bulkCopy.BulkCopyTimeout = timeout;
try
{
bulkCopy.WriteToServer(reader);
SqlCommand update = new SqlCommand(string.Format("UPDATE p SET p.Username = n.Username FROM NetworkID n INNER JOIN Person p ON n.PersonID = p.PersonID and n.VersionID = {0} where p.VersionID = {0}", VersionNum), destinationConnection);
update.ExecuteNonQuery();
}
catch (SqlException ex)
{
log.Error("Exception caught", ex);
}
finally
{
reader.Close();
}
}
}
catch (Exception e)
{
log.Error("Exception caught", e);
}
}
}
我知道我可以(并且已经)尝试过很多超时/批量大小参数。但我的问题是,从编码的角度来看,有没有办法确定哪个数据库服务器给我带来了问题?
谢谢
最佳答案
您遇到的超时可能受到设置 SqlBulkCopy.BulkCopyTimeOut 的影响默认值为 30 秒。
要确定问题出在哪里,最好的选择是捕获 SqlException查看它是否包含更多详细信息,但在您的实例中,我相信这将是您的代码(客户端)超时。
关于 SqlException 的文档有一个很好的例子说明如何枚举异常中包含的错误。
更新1
我可以看到您正在使用 MySqlCommand,我猜这是 Devart,如果是这样,您还没有为此命令设置超时,对于这个命令,您需要使用语法 CommandTimeout .
MySqlCommand commandSourceData = new MySqlCommand(string.Format(sql, VersionNum.ToString()), sourceConnection);
commandSourceData.CommandTimeout = timeout;
您还应该在 SqlCommand 上放一个.
SqlCommand update = new SqlCommand(string.Format("UPDATE p SET p.Username = n.Username FROM NetworkID n INNER JOIN Person p ON n.PersonID = p.PersonID and n.VersionID = {0} where p.VersionID = {0}", VersionNum), destinationConnection);
update.CommandTimeout = timeout;
更新2
刚刚阅读 SqlBulkCopy 上的文档并注意到以下几点:
If multiple active result sets (MARS) is disabled, WriteToServer makes the connection busy. If MARS is enabled, you can interleave calls to WriteToServer with other commands in the same connection.
我不确定您是否使用 MARS,但是,上面的代码正在调用 SQL 以在 WriteToServer 方法之后、BulkCopy 关闭之前(通过使用)进行更新。您是否可以尝试通过在 Update 之前调用 close 来显式关闭 SQLBulkCopy,或者将 Update 移到 BulkCopy 的 using 语句之外。
关于c# - SqlBulkCopy - 哪个数据库导致异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21186283/
在 .Net Aspx 页面或 Web 服务需要在表中执行大约 20-200 行插入的情况下,您会推荐以下哪种方法?为什么?小的性能提升可能意味着我仍然会使用我最熟悉的方法,所以请告诉我它是否不会产生
SqlBulkCopy可以创建一个类似于SELECT INTO的表吗? 最佳答案 我认为上述答案不太清楚。 您必须使用SQL创建表。没有别的办法了。而且,如果您只需要创建列结构,那么如果您的源代码位于
在我的程序中,我正在填充数据表,然后将其批量复制到我的数据库中。 但是,如果行中的 3 列匹配,我希望它覆盖数据库中的一行。 例如,如果我有 5 列 成员(member)编号注册日期姓名地址城市状态
我熟悉 C# SqlBulkCopy 类,您可以在其中调用通过 DataTable 传递的“WriteToServer”方法。 我的问题是 SQL Server 中使用什么底层机制来批量插入该数据?
SqlBulkCopy 的建议批量大小是多少?我正在寻找一个可以用作性能调整起点的通用公式。 最佳答案 我有一个导入实用程序与我的 SQL Server 实例位于同一物理服务器上。它使用自定义的 ID
这是 TABLE1 的架构: CREATE TABLE [dbo].[TABLE1] ( [id] [int] IDENTITY(1, 1) NOT NULL, [code] [int
要将数据从一个数据库复制到具有相同架构的不同服务器中的另一个数据库,我计划使用 C sharp 库中的 SqlBulkCopy 类。 SqlBulkCopy 在插入记录时是否会保持与数据表中相同的顺序
我可以忽略我传递给 SqlBulkCopy 的数据表中已存在于 sql 数据库中的数据的重复记录吗?如果是,那么如何,如果否和其他选项,还要解释我。 最佳答案 不,这不是内置的。您需要先清理客户端上的
我正在执行从 excel 电子表格到临时表的数据的 sql 批量复制,然后从临时表到生产数据库。 我的问题是,如果由于任何原因上传到临时表或生产数据库失败,事务是否回滚并且没有数据被导入或修改现有数据
我的软件可以部署在两种不同的配置中:一种是我全天偶尔收到单个数据点的涓流馈送,另一种是我在一天结束时得到所有数据的转储。对于日终转储,显然,我将使用具有可配置批处理大小的 SqlBulkCopy()
在我的网络应用程序中,用户可以一次插入大量数据,以提高性能,我正在使用 SqlBulkCopy 类。对于插入两个不同表的单个操作,它会运行多次。如果用户取消操作或操作失败,那么我需要回滚数据,因此我使
我有以下代码..它实际上使用 SQLBulkCopy 将数据插入目标。由于死锁,此代码在源 SQL 服务器中经常失败。仅供引用,正在复制的表可以在我们执行批量复制时使用(我的意思是一些插入/选择将运行
我正在尝试使用 SqlBulkCopy 通过在我的应用程序中手动填充 DataTable 来将新行插入到我的数据库表中。 这适用于所有表除了具有由 3 列组成的复合主键的表。每当我尝试将任何内容 Sq
我正在使用 SqlBulkCopy 将一批记录从 MySQL 复制到 SQL Server。 正好 30 秒后,我明白了 System.Data.SqlClient.SqlException (0x8
这是我的场景:我必须在表中导入大文件,所以我使用了 sqlBulkCopy,因为其他方法太慢了。 这是一个文件行的例子: String1|String2|String3|String4 这是表结构:
有人可以帮我解决这个错误吗?这是我的代码: using System; using System.Drawing; using System.Collections; using System.Com
我正在努力将数据库从 MS Access 迁移到 sql server。为了将数据移动到新表中,我决定编写一个同步例程,因为模式已经发生了相当大的变化,它让我可以在运行它的程序上运行测试,并在我需要新
我正在使用 SqlBulkCopy 对象将生成的几百万行插入到数据库中。唯一的问题是我要插入的表有一个标识列。我尝试将 SqlBulkCopyOptions 设置为 SqlBulkCopyOption
从 csv 文件插入数据。如何使用存储过程而不是 SqlBulkCopy 从数据表插入到数据库?当前使用: using (SqlBulkCopy sqlBulkCopy = new SqlBulkC
我正在尝试找到一种使用 SqlBulkCopy 向 MSSQLServer 表执行批量插入的方法,该方法将在出现错误时继续,并返回无法插入的任何行的数据表。 当我尝试使用 SqlBulkCopy 时,
我是一名优秀的程序员,十分优秀!