-1

コードでこの例外が発生するのはなぜですか? サーバーを再起動したり、ポートを変更したりしましたが、何も機能していません。

どうしたの?

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);
}

最初のクエリは正常に機能しますが、2 番目のクエリは機能しません。ご覧のとおり、他のものも使用SqlConnectionしていますが、それでも機能しません。

注:私が使用しているデータベースには少なくとも 1 億件のレコードがあり、これが問題になる可能性があると考えられます。

4

3 に答える 3

3

接続文字列に何かが正しく表示されません。代わりに使用する SqlServer ではなく、MySql の接続文字列
で常に見られる、または SqlServer の INSTANCE 名。最初のクエリが機能することは確かですか? "server=localhost; user=armin;password=root""Data Source=(LOCAL);Integrated Security=SSPI"

ただし、適切な using ステートメントを使用する必要があると思います

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); 
                }
            } 
        } 
   }
于 2012-04-20T07:22:11.293 に答える
1

この行を挿入してください

result1.CommandTimeout = 0;

2番目のクエリのこの行の前

SqlDataReader reader1 = result1.ExecuteReader();  
于 2012-06-08T11:51:23.457 に答える
0

次の後にリーダーを廃棄します。

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

...また、temp.Load(reader1) の後に接続を閉じます。また、reader1 を閉じます。

このすべての代わりに...クリーンな方法は、リーダーと接続の初期化に USING を使用することです。:)

于 2012-04-20T07:19:45.073 に答える