ASP.NET C#で重複登録を確認後、StreamWriterで書き込みができないエラーが発生する

このQ&Aのポイント
  • ASP.NET C#でStreamReaderを使用して重複登録を確認し、StreamWriterでデータを書き込むプログラムを作成しています。しかし、重複確認も書き込みもエラーが発生し、正常に動作しません。
  • エラーの内容は、'閉じている TextReader から読み取ることはできません' というものです。また、他のプロセスに使われているためのエラーも表示されます。
  • どのようにしたらプログラムを正常に実行できるのか教えてください。
回答を見る
  • ベストアンサー

ASP.NET C#で

ASP.NET C#で重複登録されないようにStreamReaderで読み込んで確認後重複がなければ StreamWriterで書き込むというプログラムを書いていたのですが、重複確認もcsvファイルへの書き込むもエラーが表示されて出来ませんでした。 sr.Close();の位置を変えても変わりませんでした。 エラー内容 ・System.ObjectDisposedException はユーザー コードによってハンドルされませんでした。 Message=閉じている TextReader から読み取ることはできません。 他にも、他のプロセスに使われているため・・・と言ったエラーも表示されます。 ソースコード protected void Button1_Click(object sender, EventArgs e) { string Searchid = TextBox1.Text;//商品コード //ファイルの存在を確認 if (!File.Exists(MapPath(".") + "\\Data\\product.csv")) { Label2.Text = "データ登録先が存在しません。管理者に連絡してください。"; return; } this.Label1.Text = string.Empty; //確認ここまで StreamReader sr = new StreamReader(MapPath(".") + "\\Data\\product.csv", true); while (sr.Peek() != -1) { string date = sr.ReadLine(); char[] delimiter = new char[] { ',' }; string[] item = date.Split(delimiter); string id = item[0]; sr.Close(); if (Searchid.Equals(id)) { Label1.Text = "既に存在する商品コードです。別の商品コードを指定してください。"; } else { Session["scode"] = TextBox1.Text;//商品コード Session["sname"] = TextBox2.Text;//商品名 Session["price"] = TextBox3.Text;//価格 StreamWriter sw = new StreamWriter(MapPath(".") + "\\Data\\product.csv", true, Encoding.GetEncoding("Shift_jis")); sw.WriteLine(TextBox1.Text + "," + TextBox2.Text + "," + TextBox3.Text);//商品コード+商品名+単価 sw.Close(); Label1.Text = "正常に登録出来ました。"; } } } どのようにしたら実行出来るのでしょうか? 教えて下されば幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • onos
  • ベストアンサー率81% (127/155)
回答No.1

まず、ASP.NETでテキストファイルを扱うのはかなり難しいということを確認してください。 通常のWindowsアプリケーションとは異なり、Webアプリケーションは複数のユーザーからの接続が同時に発生し、それを同時(に見えるよう)に処理します。 テキストファイルに、特に書き込みの処理がある場合には上記の処理が重ならないよう、1つの接続が処理している間は他の処理が作業できないようにロックをかけるといった考慮が必要です。 また、サーバー上にあるファイルには適切なユーザー権限を与えてあげる必要があります。 開発サーバー(VS上)の環境とIIS上では実行時のユーザーが異なることから、サーバーのアクセス権の管理といったサーバー運用に関する正しい知識も必要です。 これらのことを考えると、データベースを利用するほうがよっぽど楽なんですが。。。 どうしてもテキストファイルを利用する必要がある、ということなら上記のようなことについて学習してみてください。

ya-kun0618
質問者

お礼

FileStreamを使って最初からやってみようかと思います。

ya-kun0618
質問者

補足

データベースを使えば簡単だということは分かっています。 ただ、データベースを使わないで、という条件なので困っているのです

関連するQ&A

  • C# StreamReader,StreamWriter による文字化

    C# StreamReader,StreamWriter による文字化け お世話になります。 文字化けで悩んでいます。 Visual Studio 2008 C# にて、テキストファイルからデータを読んで別のテキストファイルに そのまま書き出す(もちろん実際の運用では加工するわけですが)処理で文字化けが起こります。 そのテキストファイル自身を C# で作れば問題はないのですが、メモ帳を使って書き込んだファイルでは 文字化けが起こります。 対処方法があれば教えてください。 以下はその実験に使ったコードです。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace ConsoleApplication5 { class Program { static void Main(string[] args) { // これは正常に書き込みできました StreamWriter sw = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test.txt"); sw.WriteLine("これはてすとです。"); sw.WriteLine("This is test."); sw.Close(); // これも正常に読み込め、書き込みもできました StreamReader sr = new StreamReader(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test.txt"); sw = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\newtest.txt"); while (!sr.EndOfStream) { sw.WriteLine(sr.ReadLine()); } sr.Close(); sw.Close(); // 次はあらかじめメモ帳で作ったファイルを読んで、別のファイルに書き出します // これが文字化けします sr = new StreamReader(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test2.txt"); sw = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\newtest2.txt"); while (!sr.EndOfStream) { string dat = sr.ReadLine(); sw.WriteLine(dat); Console.WriteLine(dat); } sr.Close(); sw.Close(); } } }

  • C#のプログラミングで困ってます。

    C#の事で質問です。プログラムが得意な方助けてください。 専門学生で、明日までの課題があるんですが非常に困ってます。 VisualStudio2008のWebフォームでコミュニティーみたいなものを作ろうとしています。 トップ画面のLabelに、トピック作成画面で書き込んだタイトルをリンクで表示(タイトルがTextBox1、内容がTextBox2)して、 そのリンクを押したら、タイトルに対しての内容の画面に飛ぶようなプログラムを作るところまではなんとかできました。 ・教えていただきたいこと 1、トップ画面のLabelに書き込まれたタイトルが5件だけ表示させたい 2、[次へ]ボタンを押したら6~11件を表示。それ以降11~16といったような形にしたい。 一応参考書を頼りに書いたコードです。 protected void Page_Load(object sender, EventArgs e) {  string[] msgtext;  string path = MapPath(".") + "\\community.txt";  int i = 0;  if (File.Exists(path)) {  StreamReader sr = new StreamReader(path, System.Text.Encoding.GetEncoding("sjis"));  while (sr.Peek() != -1) {  msgtext = sr.ReadLine().Split(',');  test += "<tr><td>" + msgtext[3] + "<a href =\"WebForm1.aspx?id=" + i + "\">" + msgtext[0];  i = i + 1; }  sr.Close(); }  Label1.Text += test + "</table>"; } protected.....ここから次へボタンを作りたい。 {  どうしたらいいのでしょう } 5件まで表示はfor文使うんだろうけど、どこに書いたらいいかもわかりません。 簡単でもいいのでコードなどを教えてください。 何卒お力添えお願いします。

  • C# 半角カナの文字化けについて

    こんにちは。 現在、Visual Studio 2005 C#を使っています。 ネットワーク経由で機器の情報を取得しようとしているのですが、文字化けが起きてしまいました。 調べてみると'c0','b2','d1'と帰ってきていて、これらはS-jis半角カナの'タ','イ',’ム’を表しているようです。 少し省略していますが以下のような手順で確認しています private void buttonStart_Click(object sender, EventArgs e) { TcpClient client = new TcpClient(textBoxIP.Text,int.ParstextBoxPort.Text)); NetworkStream netStream = client.GetStream(); StreamReader sr = new StreamReader(netStream); StreamWriter sw = new StreamWriter(netStream); sw.AutoFlush = true; sw.WriteLine("TestCommand"); string s = sr.ReadLine();//ここで文字化け } StreamReader,StreamWriterの設定でEncoding指定が出来るようですが、sjisは無かったように思いました。 (defaultはUTF-8になっているようですので文字化けしたようです。) どのようにすれば、sjisで文字列を取得できるでしょうか?

  • CSVの読み込みについて

    いつもお世話になります。 TextBox1に品物のコードを入れて、Label1に価格を表示するという簡単そうなものです。 品物のコードはCSVファイルのItem(1)から取得します。ところが存在しないコードを入力すると、 追加情報 : インデックスが配列の境界外です というエラーが出ます。下記ソースに何を追加すればよろしいのでしょうか?ご教授下さい。よろしくお願い致します。 Dim Reader As New IO.StreamReader("C:\XXX.csv", System.Text.Encoding.GetEncoding("Shift-JIS")) Dim Items() As String Dim Line As String = Reader.ReadLine       Dim Code As String 'コード Dim kakaku As String '価格 Do Until IsNothing(Line) Items = Line.Split(",") Code = Items(1) If HinCode = TextBox1.Text Then kakaku = Items(2) Label1.Text = kakaku Exit Sub End If Line = Reader.ReadLine Loop Reader.Close()

  • C# Form処理

    Form1とForm3からForm2を表示させれるようにして,どちらかのフォームのコントロールをクリック したらform2が立ち上がりformに応じた処理を行いたいのですが,下記のコードではエラーとなって 動きません int Pin1 = f1.butt1; int Pin3 = f3.butt3; if (Pin1 == 1) { int h = f1.but; for (int hj = 1; hj < 43; hj++) { if (h == hj) { //Labelに文字を入力。 string Memo = "label" + (hj + 93); string Hd = "label" + (hj + 51); Label f1_Memo = (Label)f1.Controls[Memo]; f1_Memo.Text = this.textBox1.Text; Label f1_Hd = (Label)f1.Controls[Hd]; f1_Hd.Text = this.textBox2.Text; } } } else if (Pin3 == 1) { int h3 = f3.but3; for (int hj3 = 1; hj3 < 43; hj3++) { if (h3 == hj3) { //Labelに文字を入力。 string Memo = "label" + (hj3 + 744); MessageBox.Show(Memo.ToString()); Label f3_Memo = (Label)f3.Controls[Memo]; f3_Memo.Text = this.textBox1.Text; } } } Form1のコントロールであれば上のforループ,Form3であれば下のforループで処理するように考えております.Form1でform3を開くコントロールを選択した場合上記コードのbutt1は0になるように しているつもりです. エラーは NullReferenceExceptionがハンドルされませんでした. オブジェクト インスタンスの作成には new キーワードを使用します。 何がいけなくてどう対処すればよろしいのでしょうか? ご教授よろしくお願いいたします.

  • C# プログラム

    今,下記のようなプログラムを組んでdatagridviewのデータをcsvに保存するようにしようとしているのですが,1つのデータであれば保存が出来たのですが,今行いたいのはdatagridviewにあるデータすべてをcsvに保存したいのです.おそらく配列か何かに入れないといけないんだとは思うのですが, どなたかご教授頂けないでしょうか? private void button2_Click(object sender, EventArgs e) { //データテーブル設定 int R, C; R = dataGridView1.RowCount - 1; C = dataGridView1.ColumnCount - 1; string wdata = string.Empty; string tmpdata = string.Empty; //string Ter =Convert.ToString(R); //string Tec = Convert.ToString(C); //textBox1.Text = Ter; //textBox2.Text = Tec; //SaveFileDialogクラスのインスタンスを作成 //SaveFileDialog sfd = new SaveFileDialog(); //ダイアログを表示する //if (sfd.ShowDialog() == DialogResult.OK) //c = dataGridView1[Rdata, Gdata].Value.ToString(); // 以下を変更 string c = Convert.ToString(dataGridView1.Rows[0].Cells[0].Value); // 以下ファイル書き込みと保存 string strName = "xxx.csv"; // 仮のファイル名 string strPath = "c:/csv/"; // 仮のディレクトリ名 SaveFileDialog sfd = new SaveFileDialog(); sfd.InitialDirectory = strPath; sfd.FileName = strName; sfd.Filter = "CSVファイル(*.csv)|*.csv"; sfd.Title = "保存先を指定してください"; sfd.RestoreDirectory = true; sfd.CheckFileExists = false; if (sfd.ShowDialog() == DialogResult.OK) { // ファイルを指定してインスタンス作成 System.IO.StreamWriter sw = new System.IO.StreamWriter(sfd.FileName); try { // ファイル書き込み sw.Write(c); } catch { // エラー処理(これだとダメだけどとりあえず) MessageBox.Show("ファイル書き込みエラー", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { // 解放 sw.Dispose(); sfd.Dispose(); } }

  • C#でのcsv保存

    今,下記のようなプログラムを組んでいます.ですが,うまくdataGridviewのデータが保存されません.何がいけないのでしょうか?だれかご教授よろしくお願いいたします. int R,C; R = dataGridView1.RowCount - 1; C = dataGridView1.ColumnCount - 1; string[] cdata = new string[R]; //string Ter =Convert.ToString(R); //string Tec = Convert.ToString(C); //textBox1.Text = Ter; //textBox2.Text = Tec; for (int Gdata = 1; Gdata < R; Gdata++) { string c = Convert.ToString(dataGridView1.Rows[Gdata].Cells[0].Value); cdata[Gdata] = c; //saveFileDialog1.Filter = "csvファイル (*.csv)|*.csv"; //if (saveFileDialog1.ShowDialog() == DialogResult.OK) //{ // int cdata = Convert.ToInt16(c); // cdata.saveNewCSVdata(saveFileDialog1.FileName); //} } //SaveFileDialogクラスのインスタンスを作成 SaveFileDialog sfd = new SaveFileDialog(); //ダイアログを表示する if (sfd.ShowDialog() == DialogResult.OK) { //OKボタンがクリックされたとき //選択された名前で新しいファイルを作成し、 //読み書きアクセス許可でそのファイルを開く //既存のファイルが選択されたときはデータが消える恐れあり System.IO.Stream stream; stream = sfd.OpenFile(); if (stream != null) { //ファイルに書き込む System.IO.StreamWriter sw = new System.IO.StreamWriter(stream); sw.Write(cdata); //閉じる sw.Close(); stream.Close(); } }

  • C++/CLIでのDataGridViewの使い方

    以前に質問させていただいたのですが、要点を得ていなかったため再度質問させていただいきます。 VC++2005のC++/CLIでプログラムを作成しています。 CSVファイルから内容を読み込み、DataGridVeiwに表示させたいと考えています。 CSVファイルを配列に読み込んで、表示するところまでは出来ています。 以下CSVファイルを読み込んで、コンソール出力するプログラムの一部 int i; StreamReader^ sr=gcnew StreamReader("hoge.csv"); String^ text=sr->ReadToEnd(); array<String^>^ line=text->Split(gcnew array<String^> {"\r\n", "\r", "\n"},StringSplitOptions::RemoveEmptyEntries); array<array<String^>^>^ table= gcnew array<array<String^>^>(line->Length); for (i=0; i<line->Length; i++) { table[i]=line[i]->Split(','); } for each (array<String^>^ output in table){ for(i=0; i<output->Length; i++){ Console::Write(output[i]); //行出力 } } 初歩的なことだとは思うのですが・・・ コンソール出力部分をDataGridViewで出力表示させるには どのように書けばいいでしょうか。 よろしくお願いします。

  • C# ファイル名を指定してオープン

    StreamWriter swrite = new StreamWriter("C:\\19yamana.csv",false, System.Text.Encoding.GetEncoding("shift-jis")); のファイル名"C:\\19yamana.csv"の部分を変数にしたいのですがうまく出来ません。 やったこと: string fileName = "C:\\19yamana.csv"; StreamWriter swrite = new StreamWriter(fileName, false, System.Text.Encoding.GetEncoding("shift-jis"));

  • C#におけるファイル読み取りの文字化け

    開発初心者です。 //Shift-JISコードとして開く System.IO.StreamReader sr = new System.IO.StreamReader(@txtShiteiFile.Text, System.Text.Encoding.GetEncoding(932)); //内容を全て読み込む string textAll = sr.ReadToEnd(); 以上の関数を使ってテキストファイル上の文字を読み取りしているのですが、 textAll 変数に入ったときに文字化けしています。 また、テキストファイルによっては文字化けしないときもあります。 この場合、どのような対処をすればよいのでしょうか?

専門家に質問してみよう