2017-08-30 19 views
0

私は何をしようとしているのですか?自分のデータベースからSelect Storeプロシージャを読み込み、csvファイルにデータを保存して、Webアプリケーションからダウンロードできるようにします。私は、一時的に私のプログラムの折り畳みにファイルを保存し、filestreamを使用して、要求された結果を得ることができました。私が今やりたいことは、ファイルが私のコンピュータに保存されている部分をスキップし、一時的にそれをRAMメモリに保存することです。私は理解したことから、私はファイルストリームの代わりにメモリストリームを使用する必要がありますが、私はそれをどうやってできるのか本当に分かりません。私が読んだことから理解したことは、ファイルを使用する代わりに、データをバイトに変換してmemorystreamを作成し、それをFileStreamResultで使用する必要があるということです。私はここで正しいですか?私は手続きから読み取られたcsvfileに保存filestreamの代わりにmemorystreamを使用する方法

方法:

public static String StoreApproved() 
{   
    string path1 = HttpRuntime.AppDomainAppPath + "Report.csv"; 
    SqlConnection sqlConnection1 = new SqlConnection("CONNECTIONSTRING"); 
    SqlCommand cmd = new SqlCommand(); 
    SqlDataReader reader; 
    cmd.CommandText = "ExportApproved"; 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Connection = sqlConnection1; 
    sqlConnection1.Open(); 
    reader = cmd.ExecuteReader(); 
    List<ModelStoreProcedureApproved> TestList = new List<ModelStoreProcedureApproved>(); 
    ModelStoreProcedureApproved test ; 

    while (reader.Read()) 
    { 
     test = new ModelStoreProcedureApproved(); 
     // test.Id = int.Parse(reader["IdTimeTracker"].ToString()); 
     test.Month = reader["Month"].ToString(); 
     test.EmailUser = reader["Email"].ToString(); 
     test.Project = reader["Name"].ToString(); 
     test.Approved = reader["Description"].ToString(); 
     test.Month = reader["Month"].ToString(); 
     test.Year = reader["Year"].ToString(); 
     TestList.Add(test); 
    } 

    File.Create(path1).Close(); 
    var i = TestList.FirstOrDefault(); 
    using (TextWriter fileReader = new StreamWriter(path1)) 
    { 
     var csv = new CsvWriter(fileReader); 
     csv.Configuration.Encoding = Encoding.UTF8; 
     foreach (var value in TestList) 
     { 
      csv.WriteRecord(value); 
     } 
     fileReader.Close(); 
    } 
    sqlConnection1.Close(); 
    return path1; 
} 

コントローラーコード:

public ActionResult ExportToCSV() 
{ 
    string path = Repositories.UserRepository.StoreApproved(); 
    var fileStream = new FileStream(path, 
            FileMode.Open, 
            FileAccess.Read); 

    return new FileStreamResult(fileStream, "text/csv") { FileDownloadName = "export.csv" }; 
} 

誰かがこれを行うための最善の方法は何であるかを私に説明できますか?私はあなたがこのようにそれを行うことができます Serialize and Deserialize using BinaryFormatter

BinaryFormatter and Deserialization Complex objects

Using CSVHelper to output stream to browser

答えて

1

を読んだ その他の記事:

public static byte[] StoreApproved() 
{   
    string path1 = HttpRuntime.AppDomainAppPath + "Report.csv"; 
    SqlConnection sqlConnection1 = new SqlConnection("CONNECTIONSTRING"); 
    SqlCommand cmd = new SqlCommand(); 
    SqlDataReader reader; 
    cmd.CommandText = "ExportApproved"; 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Connection = sqlConnection1; 
    sqlConnection1.Open(); 
    reader = cmd.ExecuteReader(); 
    List<ModelStoreProcedureApproved> TestList = new List<ModelStoreProcedureApproved>(); 
    ModelStoreProcedureApproved test ; 

    while (reader.Read()) 
    { 
     test = new ModelStoreProcedureApproved(); 
     // test.Id = int.Parse(reader["IdTimeTracker"].ToString()); 
     test.Month = reader["Month"].ToString(); 
     test.EmailUser = reader["Email"].ToString(); 
     test.Project = reader["Name"].ToString(); 
     test.Approved = reader["Description"].ToString(); 
     test.Month = reader["Month"].ToString(); 
     test.Year = reader["Year"].ToString(); 
     TestList.Add(test); 
    } 

    var i = TestList.FirstOrDefault(); 
    var mem = new MemoryStream(); 
    using (TextWriter fileReader = new StreamWriter(mem)) 
    { 
     var csv = new CsvWriter(fileReader); 
     csv.Configuration.Encoding = Encoding.UTF8; 
     foreach (var value in TestList) 
     { 
      csv.WriteRecord(value); 
     } 
    } 
    sqlConnection1.Close(); 
    return mem.ToArray(); 
} 

public ActionResult ExportToCSV() 
{ 
    byte[] bytes = Repositories.UserRepository.StoreApproved(); 
    Stream stream = new MemoryStream(bytes); 
    return new FileStreamResult(stream, "text/csv") { FileDownloadName = "export.csv" }; 
} 
+0

例外が発生します。System.ObjectDisposedException:閉じられたストリームにアクセスできません。 –

+0

なぜそれが起こったのかわからないので、バイトを使用してみてください。結果を渡すためにバイトを使用するようにコードを更新しました。 –

+0

Worked !!どうもありがとうございました。それが私にできるときに答えを承認するでしょう –

0

私はあなたにもASPを使用しているので、あなたが心配の明確な分離を行うことをお勧め.Net MVC。同じメソッド内でメモリストリームを読み込んで作成する代わりに、まず必要なデータコレクションを読み込み/取得し、メソッドからデータを返すだけです。あなたの要求に基づいて、必要なフォーマット(UIにバインドするか、ファイルを返すなど)でそれを飾ることができます。

これはあなたの質問への直接的な答えではありませんが、たとえば、メモリストリームを使用しているため、使用例としては、hereなどがあり、受け入れた回答などがあります。

+0

あなたは正しいです。あなたが言うようにして、コードを複数のメソッドに分割して、すべてがどこにあるのかは簡単に分かります。私はそれを感謝のヒントをありがとう。 –

関連する問題