私は、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();
}
このコードは私にとっては絶対にうまく機能しますが、プロセスにいくつかの変更を加えることにしました。
- キーがテーブルに挿入されるとすぐに、キー(行)がテキストファイルから削除されます。
このためには、同じ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