我有一些代码正在基于某些计算更新数据库中的记录,但出乎意料的是它正在更新表中的前4条记录,然后更新表中的第7条记录,更令人惊讶的是没有其他记录正在更新符合与更新记录类似的情况也是如此。这是代码。
public class CS_Temp
{
static void Main(string[] args)
{
Program p = new Program();
var lines = System.IO.File.ReadLines(@"C:\Users\Malik\Desktop\research_fields.txt");
var dd = new List<Tuple<string, double, string>>();
try
{
SqlConnection con = new SqlConnection("Data Source=KHIZER;Initial Catalog=subset_aminer;Integrated Security=True");
con.Open();
SqlCommand query = con.CreateCommand();
query.CommandText = "select p_abstract from sub_aminer_paper where id between 1 and 500 and DATALENGTH(p_abstract) != 0";
SqlDataReader reader = query.ExecuteReader();
string summary = null;
while (reader.Read())
{
summary = reader["p_abstract"].ToString();
dd.AddRange(lines.Select(line => Tuple.Create(line, p.calculate_CS(line, summary), summary)));
var top_value = dd.OrderByDescending(x => x.Item2).FirstOrDefault();
if (top_value != null && top_value.Item2 > 0)
{
var abstrct = top_value.Item3.ToString();
var r_field = top_value.Item1.ToString();
write_To_Database(abstrct, r_field);
}
else
{
reader.Close();
}
}
reader.Close();
}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.Message);
}
finally
{
Console.WriteLine("Executing finally block.");
}
}
public static void write_To_Database(string document, string research_field)
{
int result = 0;
try
{
string connection = "Data Source=KHIZER;Initial Catalog=subset_aminer;Integrated Security=True;MultipleActiveResultSets=True;";
using (SqlConnection con = new SqlConnection(connection))
{
con.Open();
string query = "select id from sub_aminer_paper where pid between 1 and 500 and DATALENGTH(p_abstract) != 0 and p_abstract LIKE @p_abstract";
using (SqlCommand cmd = new SqlCommand(query, con))
{
string st = document;
cmd.Parameters.AddWithValue("@p_abstract", st);
int id = 0;
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
id = reader.GetInt32(0);
}
reader.Close();
string update_query = "update sub_aminer_paper set research_area = @research_area where id = @id";
using (SqlCommand cmd_update = new SqlCommand(update_query, con))
{
int identity = id;
string r_field = research_field;
cmd_update.Parameters.AddWithValue("@id", identity);
cmd_update.Parameters.AddWithValue("@research_area", r_field);
//cmd_update.CommandTimeout = 20;
result = cmd_update.ExecuteNonQuery();
}
}
}
con.Close();
}
}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.Message);
}
}
}
问题在于while循环中的这两行,即
dd.AddRange(lines.Select(line => Tuple.Create(line, p.calculate_CS(line, summary), summary)));
var top_value = dd.OrderByDescending(x => x.Item2).FirstOrDefault();
我在调试时检查过它没有正确更新top_value以用于下一个第5,第6条记录的项目,它重复采用与第4条记录相同的top_value,同样地将top_value与第8条记录的第7条相同, 9号,10号等等,没有更新。请帮助并建议适当的更改。 感谢
答案 0 :(得分:0)
你做了一件很奇怪的事。不要这样做。这是一个非常糟糕的主意 - 打开dbdatareader,然后打开另外两个,做一些工作,插入一些记录等,然后关闭所有读者。 而不是那样,你应该使用以下两种方法之一:
将您的数据发布到存储过程并让此过程在sql server上完成所有工作(因此几乎所有这些代码都应该写在SQL上)
从sql获取数据(不是打开的阅读器,但是获取数据表),关闭连接,在.net代码中计算你想要的内容,并将计算出的行插入数据库。