程序的意思这样的:
有一个网站原来数据库是这样设计的: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();
}
}

解决方案 »

  1.   

    conn2
    cmd2
    是我后来因为效率加的。我清楚只是用一个;conn也可以
      

  2.   

    对数据库的操作应该使用存储过程,不应该使用SQL语句,用存储过程可以实现对数据库的快速操作,而不会受到编码的影响
      

  3.   

    一个Connection可以创建两个Command吗
    我下面的程序老是出错
    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();
      

  4.   

    DataReader独占连接,在重复使用这个连接之前必须关闭DataReader
    要用DataReader读取数据就先读出全部的文件名,放在一个Array中或ArrayList中,关闭datareader,然后另起一个循环读文件的内容、更新数据,最后关闭connection