我注意到我的代码出错了sqlWrite.ExecuteNonQuery();
在几秒钟内执行 200 个插入查询后。我一直以为using
将确保资源得到正确的重用,并且无需执行任何操作。这是我第一次收到此错误,我已经处理 sql/c# 近 3 年了,做着不同的事情。
using (SqlConnection varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
{
using (var sqlWrite = new SqlCommand(preparedCommand, varConnection))
{
sqlWrite.Parameters.AddWithValue("@var_agr_fname", var_agr_fname == "" ? (object) DBNull.Value : var_agr_fname);
sqlWrite.ExecuteNonQuery();
}
}
public static SqlConnection sqlConnectOneTime(string varSqlConnectionDetails)
{
var sqlConnection = new SqlConnection(varSqlConnectionDetails);
try
{
sqlConnection.Open();
}
catch
{
DialogResult result = MessageBox.Show(new Form {TopMost = true},
"Błąd połączenia z bazą danych. Czy chcesz spróbować nawiązac połączenie ponownie?",
"Błąd połączenia (000001)",
MessageBoxButtons.YesNo,
MessageBoxIcon.Stop);
if (result == DialogResult.No)
{
if (Application.MessageLoop)
{
Application.Exit(); // Use this since we are a WinForms app
}
else
{
Environment.Exit(1); // Use this since we are a console app
}
}
else
{
sqlConnection = sqlConnectOneTime(varSqlConnectionDetails);
}
}
return sqlConnection;
}
错误信息:A transport-level error has occurred when sending the request to the server. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.)
考虑建议这个错误 https://stackoverflow.com/questions/6534175/a-transport-level-error-has-occurred我应该使用SqlConnection.ClearAllPools();
以确保连接被正确重置或丢弃。所以我可以使用它,但问题是在哪里以及何时使用它?如何知道极限是否会被突破?极限在哪里?在 50 / 150 / 200 ?或者我应该每次循环使用它?
首先,我要说的是这段代码很糟糕。您将 UI 与数据连接创建混合在一起。此外,您还可以在catch
部分并进行递归调用!这非常混乱,本身就可能导致错误和不可预测的行为。而且(原始)格式使其难以阅读。很抱歉发表了严厉的评论,但您确实应该重新设计这段代码。
除此之外,您的代码应该可以正常工作,但是如果您得到No process is on the other end of the pipe.
错误意味着您的数据库和/或 SQL Server 出现问题。看起来它被堵塞了并且不再接受任何连接。如果您在短时间内运行批量插入,请尽可能在一个连接上进行。ClearAllPools
这是发生错误时恢复的一种方法,最好找出问题所在,而不是掩盖错误。这就像牙齿疼时服用扑热息痛却不去看牙医一样。
另一件事是使用多个 SqlConnection 为每个连接创建单独的事务。这增加了 SQL Server 的负载,尽管它每秒确实可以执行数百个以上的事务。
另外,您可以将传输更改为命名管道和 TCP,看看是否会发生任何变化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)