执行代码时出错,我正在使用C#& SQL Server 7/2000。
我正在做的步骤是:
请查看我的代码,欣赏有关如何修复它的反馈...因为它让我疯狂了几天!谢谢!
public void Execute()
{
SqlConnection conn = null;
SqlConnection conn2 = null;
SqlDataReader rdr = null;
try
{
Helper helper = new Helper();
using (conn = new SqlConnection(helper.MISDBConnectionString))
{
conn.Open();
string ticketid = null;
bool bTerm = false;
int rowsAffected = 0;
if (rdr != null) { rdr.Close(); }
SqlCommand selectCommand = new SqlCommand();
selectCommand.CommandText = "SELECT ...";
selectCommand.Connection = conn;
rdr = selectCommand.ExecuteReader();
while (rdr.Read())
{
ticketid = rdr["ticketid"].ToString();
bTerm = calling webserver for validation
if (bTerm)
{
using (conn2 = new SqlConnection(helper.MISDBConnectionString))
{
conn2.Open();
SqlCommand updateCommand = new SqlCommand();
updateCommand.CommandText = "UPDATE ticket SET code = @code WHERE ticketid = @ticketid";
updateCommand.CommandType = CommandType.Text;
updateCommand.CommandTimeout = 120;
updateCommand.Parameters.AddWithValue("@code", 8);
updateCommand.Parameters.AddWithValue("@ticketid", ticketid);
updateCommand.Connection = conn2;
rowsAffected = updateCommand.ExecuteNonQuery(); //fails here
}
}
}
}
}
catch (Exception ex)
{
logger.Error(ex.ToString());
}
finally
{
if (conn != null) { conn.Close(); }
if (conn2 != null) { conn2.Close(); }
if (rdr != null) { rdr.Close(); }
}
}
我需要使用两个连接,因为如果我使用一个在执行更新之前需要关闭dataReader的错误会给我一个错误
我目前得到的错误:
System.Data.SqlClient.SqlException(0x80131904):超时已过期。该 在完成操作或之前经过的超时时间 服务器没有响应。在 System.Data.SqlClient.SqlConnection.OnError(SqlException异常, Boolean breakConnection)at System.Data.SqlClient.SqlInternalConnection.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.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior,String resetOptionsString)at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(的CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async)at System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String 方法,DbAsyncResult结果)at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result,String methodName,Boolean sendToPipe)at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()at GDR.UpdateTicket.Execute()
答案 0 :(得分:1)
很难说出导致超时的原因,很可能是你造成了死锁。但是,我认为你应该首先改变这一点:
请勿使用第二个连接,先读取所有数据,关闭阅读器,然后使用相同或其他连接进行处理。如果数据太多 - 请在页面中进行。
我的意思是这样的
List<string> ids = new List<string>
while (rdr.Read())
{
ids.add(rdr["ticketid"].ToString())
}
rdr.Close();
foreach(id in ids)
{
// ...
此外,您不需要这样做
if (conn != null) { conn.Close(); }
if (conn2 != null) { conn2.Close(); }
using(conn=new ...)
声明为您做到了这一点。
答案 1 :(得分:0)
我同意Anri的观点,这很可能是由于锁定问题。您是否尝试在WITH (NOLOCK)
语句中使用SELECT
来查看是否可以解决问题?这应该允许您在迭代结果时更新表,而SELECT
语句不会持有读锁定,从而阻止UPDATE
执行。