超时已过期.操作完成之前经过的超时期限或服务器没有响应



我做了一些研究来解决这个错误。但是没有运气。请帮助删除此错误。

我正在使用SQL Server 2013

这是我的代码:

//Declarations
SqlCommand CMD;
SqlDataReader Reader;
private void Save(string EmplID, double MRate, double HRate, double DRate)
{
     CMD = new SqlCommand("SELECT * FROM tblEmpl WHERE ACTIVE = 1", dbConn.connection);
     Reader = CMD.ExecuteReader();
     while (Reader.Read())
     {
          CMD = new SqlCommand("UPDATE tblEmpl SET MRate = " + MRate + ", HRate = " + HRate + ", DRate = " + DRate + " WHERE EmplID = '" + EmplID + "'", dbConn.connection);
          CMD.ExecuteNonQuery();
     }
}

我还尝试将查询存储在存储过程中并将值传递给参数,但也给出了相同的错误。

如您所见,查询只是基本的。我不知道为什么我会收到这个错误。

请帮忙。谢谢。

按如下所示修改更新查询,并在没有读取器的情况下执行它(单个更新语句(。

update tblEmpl 
set your fields = your values
where active = 1 
and EmplID = parameter

尝试直接从 SQL 触发查询。然后检查连接字符串。

尝试使用 WITH (NOLOCK( 和不同的 SqlCommand 实例进行更新查询

//Declarations
SqlCommand CMD;
SqlCommand CMDUPDATE;
SqlDataReader Reader;
private void Save(string EmplID, double MRate, double HRate, double DRate)
{
     CMD = new SqlCommand("SELECT * FROM tblEmpl WITH (NOLOCK) WHERE ACTIVE = 1", dbConn.connection);
     Reader = CMD.ExecuteReader();
     while (Reader.Read())
     {
          CMDUPDATE = new SqlCommand("UPDATE tblEmpl SET MRate = " + MRate + ", HRate = " + HRate + ", DRate = " + DRate + " WHERE EmplID = '" + EmplID + "'", dbConn.connection);
          CMDUPDATE.ExecuteNonQuery();
     }
}

带(无锁(

以下是我可以为代码建议的内容:

//Declarations
SqlCommand CMD;
SqlDataReader Reader;
private void Save(string EmplID, double MRate, double HRate, double DRate)
{
     CMD = new SqlCommand("SELECT a,b FROM tblEmpl WITH (NOLOCK) WHERE ACTIVE = 1", dbConn.connection);
     Reader = CMD.ExecuteReader();
     while (Reader.Read())
     {
       //// TODO : Populate a List of model with all the records
     }
    //// Foreach records update it
    Foreach(var item in <List of models>)
    {
          CMD = new SqlCommand("UPDATE tblEmpl SET MRate = " + item.MRate + ", HRate = " + item.HRate + ", DRate = " + item.DRate + " WHERE EmplID = '" + item.EmplID + "'", dbConn.connection);
          CMD.ExecuteNonQuery();
    }
}

以下是我建议遵循的方法,以避免锁定数据库表。

它是类似于员工表和类的示例代码,其中包含一些列。您需要根据需要进行更改。

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public double Salary { get; set; }
    public DateTime DateOfBirth { get; set; }
    public bool IsActie { get; set; }
}
using (var conn = new SqlConnection("Your Db Connection String"))
{
    SqlCommand cmd = new SqlCommand("SELEC * FROM Employee WHERE IsActive = 1", conn);
    cmd.CommandType = CommandType.Text;
    conn.Open();
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            var emp = new Employee();
            emp.Id = reader.GetInt32(0);
            emp.Name = reader.GetString(1);
            emp.Salary = reader.GetDouble(2);
            emp.DateOfBirth = reader.GetDateTime(3);
            emp.IsActie = reader.GetBoolean(4);
            employees.Add(emp);
        }
    }
    SqlCommand updateCommand = new SqlCommand("UPDATE Employee SET Salary=@salary WHERE Id=@id", conn);
    updateCommand.Parameters.Add(new SqlParameter("@salary", SqlDbType.Float));
    updateCommand.Parameters.Add(new SqlParameter("@id", SqlDbType.Int));
    foreach (var employee in employees)
    {
        double salary = CalculateSalary();
        updateCommand.Parameters["@salary"].Value = salary;
        updateCommand.Parameters["@id"].Value = employee.Id;
        updateCommand.ExecuteNonQuery();
    }
}

这应该可以帮助您解决问题。

最新更新