为什么我的代码中会出现此异常?我重新启动了服务器,更改了端口等,但没有任何工作。
怎么了?
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亿条记录,想到这可能是个问题。
答案 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初始化读者和连接。 :)