@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

CSVファイルアクセスについて

1
投稿者投稿内容
ターキッシュ
大ベテラン
会議室デビュー日: 2003/01/15
投稿数: 126
投稿日時: 2005-11-10 20:27
いつも勉強させて頂いております。

WebページでログインをCSVファイルを読み取って条件に合致したら
ログインOKという処理を行っています。

CSVファイルの読み取りにおいて、環境を変えたところエラーが生じました。

あるサイトで、CSVファイルのデータをSQL文で取得できると
紹介してあったので、下記のような方法でデータを取得していました。

TEST.csvには今日の日付に対応したデータが入っています。
_______________________________________________________________
System.Data.OleDb.OleDbConnection oCon
= new System.Data.OleDb.OleDbConnection(
"Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + PathCSVFile + ";" +
"Extended Properties=\"text;HDR=YES;FMT=Delimited\"");
oCon.Open();
OleDbCommand sqlCmd=oCon.CreateCommand();
sqlCmd.CommandText="select * from TEST.csv"
+ " where date= 今日の日付;

OleDbDataReader myReader;
myReader=sqlCmd.ExecuteReader(CommandBehavior.CloseConnection);

while(myReader.Read())
{
csvdata=myReader.GetValue(1).ToString();
}

oCon.Close();
myReader.Close();

__________________________________________________________________

これが、2000サーバ+IIS5では問題なかったのですが、
複数WEBガーデンを設定した2003サーバ+IIS6で下記のようなエラーが
生じました。

「ファイル 'TEST.csv' を開くことができませんでした。
ほかのユーザーが排他的に開いているか、データを読み取る権限がありません。Source:Microsoft JET Database Engine」

となり、上のソースでは複数ワーカープロセスの上限を越えた場合に
対応できないものと思い、下記のソースに変更しようとしましたが、
果たしてこれは複数ワーカープロセスに対応できるものかどうかを教えて
頂きたく思っております。

______________________________________________________________________

FileStream fs =new FileStream(PathCSVFile,FileMode.Open,FileAccess.Read);
StreamReader sr = new StreamReader(fs,Encoding.Default);

while ((read_line=sr.ReadLine()) != null)
{
read_array=read_line.Split(',');
if(今日の日付.Equals(read_array[0].ToString())==true)
{
     csvdata=read_array[1].ToString();
return;
}
}
______________________________________________________________________

まだまだ未熟なもので申し訳ありませんが、よろしくご指導お願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-11 01:25
IIS の再起動で解決しませんか?
もしそうであれば、IIS 側が掴んでいることになります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ターキッシュ
大ベテラン
会議室デビュー日: 2003/01/15
投稿数: 126
投稿日時: 2005-11-11 09:32
じゃんぬねっと様ご返答ありがとうございます。

Microsoft.Jet.OLEDBでの方法は2003サーバ上でIISを再起動すれば、
また動くようになりますが、設定したWEBガーデン以上のアクセスが
あると、またエラーになります。

FileStreamを使用した方法では、今のところ上記のような状態には
ならないので、大丈夫かとは思うのですが、なにせ確証が持てない
ものですからここに質問した次第です。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-11 09:47
引用:

ターキッシュさんの書き込み (2005-11-11 09:32) より:

Microsoft.Jet.OLEDBでの方法は2003サーバ上でIISを再起動すれば、
また動くようになりますが、設定したWEBガーデン以上のアクセスが
あると、またエラーになります。


using と try 〜 finally を使って、Close と Dispose を保証するくらいしかないですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ターキッシュ
大ベテラン
会議室デビュー日: 2003/01/15
投稿数: 126
投稿日時: 2005-11-11 14:20
じゃんぬねっとさんご返答ありがとうございます。

すぐ近くの投稿で原因が解りました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=25938&forum=7&4
に書かれてある

[ACC2002] IIS と共に Microsoft Jet を使用する

が原因です。
「複数の同時実行ユーザーが Microsoft Access データベースに要求を行うと、予期しない結果が生じることがあります。」
と書かれてあるので、まさにその通りだと思います。

FileStreamの方法が大丈夫かどうかの疑問は残りますが、恐らくこのような
問題は起こらないはずと思います。


じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-11 18:10
おー、普段使わないだけに存じなかったです。
勉強させて頂いてありがとうございます。(*_ _)

やっぱり、MSSQL を使いなさいってことですね... (;_ _)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)