0

私は、10000行以上の一意のキー(新しい行の各キー)で構成されるテキストファイルがあるコードを実行しています。キーを、提供されたProductIDおよびProductFeaturesとともにテーブルに挿入する必要があります。

これは、テーブル内の既存のキーをチェックし、キーの冗長性を減らす次のコードを使用して実現しました(テーブル内でキーが2回表示されることはありません)。

public void reader(string productid,string productfeature)
{
    con.Open();
    using (StreamReader sr = new StreamReader(Server.MapPath("keys.txt")))
    {
        while(sr.Peek() >=0)
        {
            string str = sr.ReadLine();
            SqlCommand cmd = new SqlCommand("select count(newkey) from serialkey where newkey ='"+str.ToString()+"'", con);
            int keyvalue = Convert.ToInt32(cmd.ExecuteScalar());
            if (keyvalue == 0)
            {
                com = new SqlCommand("insert into SerialKey (productid,productfeatures,newkey) values ('" + productid.ToString() + "','" + productfeature.ToString() + "','" + key + "')", con);
                com.ExecuteNonQuery();
            }
        }
    }
    con.Close();
}

このコードは私にとっては絶対にうまく機能しますが、プロセスにいくつかの変更を加えることにしました。

  1. キーがテーブルに挿入されるとすぐに、キー(行)がテキストファイルから削除されます。

このためには、同じwhileループ内でStreamWriter / Textwriterを使用する必要があると思うので、このコードを使用してみました。

using (StreamReader sr = new StreamReader(Server.MapPath("keys.txt")))
{
    while (sr.Peek() >= 0)
    {
        string str = sr.ReadLine();
        SqlCommand cmd = new SqlCommand("select count(newkey) from serialkey where newkey ='" + str.ToString() + "'", con);
        int keyvalue = Convert.ToInt32(cmd.ExecuteScalar());

        if (keyvalue == 0)
        {
            string line = null;
            sr.Close();
            TextWriter writer = new StreamWriter(Server.MapPath("keys.txt"), true);
            if (insert(productid, productfeature, str))
            {
                if (str != null)
                {
                    writer.WriteLine(line);
                }
                writer.Flush();
                writer.Close();
            }                    
        }
    }
}

挿入された行を削除するために正しいロジックを使用したと思います。コード行を保持する場合

sr.Close();

次のエラーが発生します

閉じたTextReaderから読み取ることができません。」

行を削除すると

sr.Close();

エラーが発生します

「別のプロセスで使用されているため、プロセスはファイル'myfolderpath\keys.txt'にアクセスできません。」

whileloop内でStreamReaderとStreamWriterのネストを使用できますか?最後に、テーブルに挿入されたばかりの行を削除する必要があります。

前もって感謝します、

Viknesh

4

2 に答える 2

0

keys.txt ファイルからコンテンツを取得し、キーをテーブルに挿入してから、キーが存在する行を keys.txt ファイルから削除する方法を並べ替えることができませんでした。特定のキーがテーブル内に挿入されるとすぐに、txt ファイルからキーを削除する必要があります。

ここでは、すべてのキーを取得して配列に格納し、foreach ループを使用して挿入した後、txt ファイルの内容をクリアします。

それでも、パフォーマンスの問題があるため、前者の方法を好みます。それでも、誰でもこのコードのチャンクを試すことができます。

ファイル keys.txt から 3000 行のキーを取得し、それらをテーブル内に挿入するまでの遅延時間は、約 8 秒かかります。

次の行のソースコードをまだ引用しています

using (StreamReader sr = new StreamReader(Server.MapPath("keys.txt")))
    {

        string keys = sr.ReadToEnd();
        string[] allkeys = Regex.Split(keys, "\r\n");
        foreach (string values in allkeys)
        {
            SqlCommand cmd = new SqlCommand("select count(newkey) from serialkey where newkey ='" + values.ToString() + "'", con);
            int keyvalue = Convert.ToInt32(cmd.ExecuteScalar());

            if (keyvalue == 0)
            {
                com = new SqlCommand("insert into SerialKey (productid,productfeatures,newkey) values ('" + productid.ToString() + "','" + productfeature.ToString() + "','" + key + "')", con);
                com.ExecuteNonQuery();
            }

        }
        sr.Close();
        File.WriteAllText(Server.MapPath("keys.txt"), string.Empty);
}

このコードのチャンクが、同じ種類の問題を抱えている人に役立つことを願っています。これは、私のクエリに対する解決策ではなく、私にとっては単なる代替方法です。

于 2012-08-29T11:51:39.090 に答える
0

問題は、ファイルを読み取るときにファイルに書き込むことに帰着します。

特定の最大可能ファイルサイズを下回る場合、これを行う最も簡単な方法は、最初にすべてをメモリに読み込むことです。これにより、作業する行のリストが得られます。リストに保持される行を追加し、リーダーを閉じた後に書き込みます。

一定のサイズになるとメモリを使いすぎますが、別のファイルに書き込んで、後で古いファイルにコピーすることができます。

例を挙げますが、コードの他の問題は、あなたが何をしているのかを完全に把握できないことを意味します(line常にnullですが、書き込まれていstrます。nullになることはありませんが、nullの場合はチェックされます)。

于 2012-08-29T09:56:34.063 に答える