程序的意思这样的:
有一个网站原来数据库是这样设计的:Article是由文件存储,数据库的Article表中的ArticleContent只是存储文本文件的文件名。比如12234dfj.txt
程序的意思就是,从Article表中读文件名,据文件名找到文件,读出内容,,,再写入数据库中的ArticleContent(原来只是存储文件名)
Article表一共有15000左右数据问题是,我的程序的效率太低了,刚刚开始很快,有时更新到4000多条就慢了。
请帮忙
class Class1
{
private const string SELECT_STR ="SELECT ArticleID,ArticleContent FROM Article WHERE ArticleID>5083 AND MainItemID BETWEEN 18 AND 23";
private const string CONN_STR ="server=(local);uid=sa;pwd=;database=season3";
private const string UPDATE_STR_FORMAT ="UPDATE Article SET ArticleContent=@content WHERE ArticleID=@id";
private const string FILE_DIR =@"E:\SeaSon\bak\txt\{0}";
private static int count;
private static int error;
[STAThread]
static void Main(string[] args)
{
SqlConnection conn=new SqlConnection(CONN_STR);
SqlCommand cmd=conn.CreateCommand();
SqlConnection conn2=new SqlConnection(CONN_STR);
SqlCommand cmd2=conn2.CreateCommand(); cmd.CommandText=SELECT_STR;
conn.Open();
SqlDataReader rdr=cmd.ExecuteReader();
string id,fileName,content;
try
{
while(rdr.Read())
{
id=rdr["ArticleID"].ToString();
fileName=rdr["ArticleContent"].ToString();
count++;
Console.WriteLine(fileName+'\t'+id);
//read file
FileStream fs=new FileStream(string.Format(FILE_DIR,fileName),FileMode.Open);
StreamReader sr=new StreamReader(fs,Encoding.GetEncoding("GB2312"));
content=sr.ReadToEnd();
sr.Close(); conn2.Open();
cmd2.CommandText=string.Format(UPDATE_STR_FORMAT);
cmd2.Parameters.Add("@content",SqlDbType.NText);
cmd2.Parameters["@content"].Value=content;
cmd2.Parameters.Add("@id",SqlDbType.Int);
cmd2.Parameters["@id"].Value=id;
cmd2.ExecuteNonQuery();
conn2.Close(); GC.Collect();
}
}
catch
{
error++;
throw;
}
finally
{
GC.Collect();
rdr.Close();
conn.Close();
}
Console.WriteLine("Total:"+count);
Console.WriteLine("Error:"+error);
Console.ReadLine();
}
// private static string readText(string fileName)
// {
// FileStream fs=new FileStream(string.Format(FILE_DIR,fileName),FileMode.Open);
// StreamReader sr=new StreamReader(fs,Encoding.GetEncoding("GB2312"));
// string content=sr.ReadToEnd();
// sr.Close();
// File.Delete(string.Format(FILE_DIR,fileName));
// return content;
// }
private static void updateContent(ref string id,ref string content)
{
SqlConnection conn2=new SqlConnection(CONN_STR);
SqlCommand cmd2=conn2.CreateCommand();
conn2.Open();
cmd2.CommandText=string.Format(UPDATE_STR_FORMAT);
cmd2.Parameters.Add("@content",SqlDbType.NText);
cmd2.Parameters["@content"].Value=content;
cmd2.Parameters.Add("@id",SqlDbType.Int);
cmd2.Parameters["@id"].Value=id;
cmd2.ExecuteNonQuery();
conn2.Close();
}
}
有一个网站原来数据库是这样设计的:Article是由文件存储,数据库的Article表中的ArticleContent只是存储文本文件的文件名。比如12234dfj.txt
程序的意思就是,从Article表中读文件名,据文件名找到文件,读出内容,,,再写入数据库中的ArticleContent(原来只是存储文件名)
Article表一共有15000左右数据问题是,我的程序的效率太低了,刚刚开始很快,有时更新到4000多条就慢了。
请帮忙
class Class1
{
private const string SELECT_STR ="SELECT ArticleID,ArticleContent FROM Article WHERE ArticleID>5083 AND MainItemID BETWEEN 18 AND 23";
private const string CONN_STR ="server=(local);uid=sa;pwd=;database=season3";
private const string UPDATE_STR_FORMAT ="UPDATE Article SET ArticleContent=@content WHERE ArticleID=@id";
private const string FILE_DIR =@"E:\SeaSon\bak\txt\{0}";
private static int count;
private static int error;
[STAThread]
static void Main(string[] args)
{
SqlConnection conn=new SqlConnection(CONN_STR);
SqlCommand cmd=conn.CreateCommand();
SqlConnection conn2=new SqlConnection(CONN_STR);
SqlCommand cmd2=conn2.CreateCommand(); cmd.CommandText=SELECT_STR;
conn.Open();
SqlDataReader rdr=cmd.ExecuteReader();
string id,fileName,content;
try
{
while(rdr.Read())
{
id=rdr["ArticleID"].ToString();
fileName=rdr["ArticleContent"].ToString();
count++;
Console.WriteLine(fileName+'\t'+id);
//read file
FileStream fs=new FileStream(string.Format(FILE_DIR,fileName),FileMode.Open);
StreamReader sr=new StreamReader(fs,Encoding.GetEncoding("GB2312"));
content=sr.ReadToEnd();
sr.Close(); conn2.Open();
cmd2.CommandText=string.Format(UPDATE_STR_FORMAT);
cmd2.Parameters.Add("@content",SqlDbType.NText);
cmd2.Parameters["@content"].Value=content;
cmd2.Parameters.Add("@id",SqlDbType.Int);
cmd2.Parameters["@id"].Value=id;
cmd2.ExecuteNonQuery();
conn2.Close(); GC.Collect();
}
}
catch
{
error++;
throw;
}
finally
{
GC.Collect();
rdr.Close();
conn.Close();
}
Console.WriteLine("Total:"+count);
Console.WriteLine("Error:"+error);
Console.ReadLine();
}
// private static string readText(string fileName)
// {
// FileStream fs=new FileStream(string.Format(FILE_DIR,fileName),FileMode.Open);
// StreamReader sr=new StreamReader(fs,Encoding.GetEncoding("GB2312"));
// string content=sr.ReadToEnd();
// sr.Close();
// File.Delete(string.Format(FILE_DIR,fileName));
// return content;
// }
private static void updateContent(ref string id,ref string content)
{
SqlConnection conn2=new SqlConnection(CONN_STR);
SqlCommand cmd2=conn2.CreateCommand();
conn2.Open();
cmd2.CommandText=string.Format(UPDATE_STR_FORMAT);
cmd2.Parameters.Add("@content",SqlDbType.NText);
cmd2.Parameters["@content"].Value=content;
cmd2.Parameters.Add("@id",SqlDbType.Int);
cmd2.Parameters["@id"].Value=id;
cmd2.ExecuteNonQuery();
conn2.Close();
}
}
解决方案 »
- listbox中的删除问题
- 用c#如何在记事本中添加“工具栏”功能
- 想做这么一个效果
- 分布式数据采集系统 谁有相关的资料?
- 关于Table的奇怪问题
- 这个语句错在哪里?SOS!
- 新手求教如何写撤销与重做的代码
- C#object类型序列化后存入SQl中,然后经过查询将结果保存在Datatable中返回,如何从Datatable中取出数据并反序列化成object类型
- WINFORM窗口的控件
- 跟MS的。NET,C#有钱储否?
- StatusBar 控件中的一个面板StatusBarPanel对象,想给它的Style设成双缓冲,但SetStyle方法是protected,不能调用,该怎样设?
- 问:关于Cookies的基本操作...
cmd2
是我后来因为效率加的。我清楚只是用一个;conn也可以
我下面的程序老是出错
200348122356ru9cGB.txt 5084未处理的异常: System.InvalidOperationException: 已有打开的与此连接相关联的 Data
Reader,必须首先将它关闭。
at System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean ex
ecuting)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior cmdBehavior
, RunBehavior runBehavior, Boolean returnStream)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at CmdLine.Class1.Main(String[] args)
SqlConnection conn=new SqlConnection(CONN_STR);
SqlCommand cmdSelect=conn.CreateCommand();
SqlCommand cmdUpdate=conn.CreateCommand(); cmdSelect.CommandText=SELECT_STR;
conn.Open();
SqlDataReader rdr=cmdSelect.ExecuteReader();
string id,fileName,content;
try
{
while(rdr.Read())
{
id=rdr["ArticleID"].ToString();
fileName=rdr["ArticleContent"].ToString();
count++;
Console.WriteLine(fileName+'\t'+id);
//read file
FileStream fs=new FileStream(string.Format(FILE_DIR,fileName),FileMode.Open);
StreamReader sr=new StreamReader(fs,Encoding.GetEncoding("GB2312"));
content=sr.ReadToEnd();
sr.Close();
//update database
cmdUpdate.CommandText=string.Format(UPDATE_STR_FORMAT);
cmdUpdate.Parameters.Add("@content",SqlDbType.NText);
cmdUpdate.Parameters["@content"].Value=content;
cmdUpdate.Parameters.Add("@id",SqlDbType.Int);
cmdUpdate.Parameters["@id"].Value=id;
cmdUpdate.ExecuteNonQuery();
GC.Collect();
}
}
catch
{
error++;
throw;
}
finally
{
rdr.Close();
conn.Close();
}
Console.WriteLine("Total:"+count);
Console.WriteLine("Error:"+error);
Console.ReadLine();
要用DataReader读取数据就先读出全部的文件名,放在一个Array中或ArrayList中,关闭datareader,然后另起一个循环读文件的内容、更新数据,最后关闭connection