SQL超时异常

时间:2012-04-20 07:10:33

标签: c# sql-server ado.net

为什么我的代码中会出现此异常?我重新启动了服务器,更改了端口等,但没有任何工作。

怎么了?

DataTable dt = new DataTable();

SqlConnection con = new SqlConnection("server=localhost;user=armin;password=root;");
con.Open();

SqlCommand result = new SqlCommand(
    "SELECT userid FROM KDDData.dbo.userprofile order by userid", con);

SqlDataReader reader = result.ExecuteReader();
dt.Load(reader);

List<string> userids = new List<string>(dt.Rows.Count);

foreach (DataRow item in dt.Rows)
{
    userids.Add(item.ItemArray[0].ToString().Trim());
}

con.Close();

con = new SqlConnection("server=localhost;user=armin;password=root;");
con.Open();

foreach (string user in userids)
{
    DataTable temp = new DataTable();
    SqlCommand result1 = new SqlCommand(
    "select itemid from KDDTrain.dbo.train where userid=" + user, con);

    SqlDataReader reader1 = result1.ExecuteReader();

    if (!reader1.HasRows)
    {
        continue;
    }

    temp.Load(reader1);
}

第一个查询工作正常,但第二个查询没有。正如你所看到的,我甚至使用了其他SqlConnection,但它仍然不起作用。

注意:我正在使用的数据库至少有1亿条记录,想到这可能是个问题。

3 个答案:

答案 0 :(得分:3)

连接字符串中的某些内容并不正确 我总是在MySql的连接字符串中看到"server=localhost; user=armin;password=root"而不是SqlServer,而是使用"Data Source=(LOCAL);Integrated Security=SSPI"或SqlServer的INSTANCE名称。你确定第一个查询有效吗?

但是我认为你应该使用适当的使用声明

DataTable dt = new DataTable(); 
using(SqlConnection con = new SqlConnection("server=localhost;user=armin;password=root;"))
{
    using(SqlCommand result = new SqlCommand(
            "SELECT userid FROM KDDData.dbo.userprofile order by userid", con))
    {
        con.Open(); 
        using(SqlDataReader reader = result.ExecuteReader())
        {
           dt.Load(reader); 
           List<string> userids = new List<string>(dt.Rows.Count); 
           foreach (DataRow item in dt.Rows) 
           { 
              userids.Add(item.ItemArray[0].ToString().Trim()); 
           }
        } 
        DataTable temp = new DataTable(); 
        foreach (string user in userids) 
        { 
            using(SqlCommand result1 = new SqlCommand( 
            "select itemid from KDDTrain.dbo.train where userid=" + user, con))
            {
                using(SqlDataReader reader1 = result1.ExecuteReader())
                {
                    if (!reader1.HasRows)   continue; 
                    temp.Load(reader1); 
                }
            } 
        } 
   }

答案 1 :(得分:1)

请插入此行

result1.CommandTimeout = 0;

在第二个查询中的这一行之前

SqlDataReader reader1 = result1.ExecuteReader();  

答案 2 :(得分:0)

在以下情况下处理您的读者:

foreach (DataRow item in dt.Rows)
{
    userids.Add(item.ItemArray[0].ToString().Trim()); 
} 

...并在temp.Load(reader1)之后关闭连接。同时关闭阅读器1。

而不是所有这些...干净的方法是使用USING初始化读者和连接。 :)