2

SQLをCSVに転送するコードがあります:

public void CreateCSVFile(DataTable dt, string strFilePath, bool Is_Ordre, int TypeDonne)
{

    //FileStream fs = new FileStream(strFilePath, FileMode.Create);
    // FileStream fs = File.Create(strFilePath);

    // Create the CSV file to which grid data will be exported.
    //StreamWriter sw = new StreamWriter(fs);
    //StreamWriter sw = new StreamWriter(strFilePath, false);
    using (var sw = new StreamWriter(strFilePath, false))
    {
        // First we will write the headers.
        //DataTable dt = m_dsProducts.Tables[0];
        int iColCount = dt.Columns.Count;
        for (int i = 0; i < iColCount; i++)
        {
            sw.Write(dt.Columns[i]);
            if (i < iColCount - 1)
            {
                sw.Write(",");
            }
        }
        if (Is_Ordre) sw.Write(", TYP_DONNE");

        sw.Write(sw.NewLine);

        // Now write all the rows.
        foreach (DataRow dr in dt.Rows)
        {
            for (int i = 0; i < iColCount; i++)
            {
                if (!Convert.IsDBNull(dr[i]))
                {
                    sw.Write("\'" + dr[i].ToString().Replace("'", " ").Replace(",", ".") + "\'");
                }
                else
                {
                    sw.Write("\' \'");
                }
                if (i < iColCount - 1)
                {
                    sw.Write(",");
                }
            }
            if (Is_Ordre) sw.Write(", \'" + TypeDonne + "\'");
            sw.Write(sw.NewLine);
        }                
        sw.Flush();
        sw.Close();
        sw.Dispose();
    }
        //fs.Close();

}

その後、CSVファイルを電子メールで送信します。

Attachment data_OD = new Attachment(LeSource, MediaTypeNames.Application.Octet);
Attachment data_LV = new Attachment(LeSource_LV, MediaTypeNames.Application.Octet);
oEmail.SendingEmail(ClientID,  data_OD, data_LV);

public void SendingEmail(string CodeClient, Attachment dataOD, Attachment dataLV)
{
    try
    {
        Pers_Conf oConf = LeConf.Get_Config(CodeClient);

        MailMessage omail = new MailMessage();
        var oSmtp = new SmtpClient("smtp.gmail.com", 587)
        {
            Credentials = new NetworkCredential("xxxxxx@gmail.com", "xxxxxx"),
            EnableSsl = true
        };

        omail.From = new MailAddress("xxxxx@gmail.com");               
        omail.To.Add(oConf.EmailAddr);
        omail.Subject = "xxxxxx_" + CodeClient;
        omail.Body = CodeClient;

        omail.Attachments.Add(dataOD);
        omail.Attachments.Add(dataLV);

        oSmtp.Send(omail);
    }
    catch (Exception excThrown)
    {
        throw excThrown;
    }

ファイルが正しく閉じられてStreamWriterいないようです。私はすでにこれを試しています:

    Try
    {
    StreamWriter sw = new StreamWriter(strFilePath, false);
    }
    Catch
    {
    }
    Finaly
    {
     sw.Flush();
     sw.Close();
     sw.Dispose();
}

しかし、finallyブロック内ではそれは認識しませんsw

何か案が ?

PS:このコード行は、ファイルが他のプロセスによって使用されていることを通知する例外をスローします

 using (var sw = new StreamWriter(strFilePath, false))

正しく閉じられていないために閉じてStreamWriterいない、または送信メールがこのファイルを使用しているためですか?

4

5 に答える 5

1

このコードを複数回入力するとします。
いずれの場合もMailMsg.Dispose()MailMessageクラスの を呼び出す必要があります。そうしないと、添付ファイルが保持され、次に書き込みを試みたときにファイルがロックされます。

usingMailMessage でもステートメントを使用してみてください

        try 
        { 
            Pers_Conf oConf = LeConf.Get_Config(CodeClient); 

            using(MailMessage omail = new MailMessage())
            {
                .....
                oSmtp.Send(omail); 
            }
        } 
        catch (Exception excThrown) 
        { 
            throw excThrown; 
        } 
于 2012-08-23T08:35:32.203 に答える
0

これは、あなたStreamWriterがスコープ外であると宣言されているためです。代わりにこれを試してください。

using (StreamWriter sw = new StreamWriter(strFilePath, false))
{
}

これにより、コンパイル時にtryとコードが追加されます。または、自分でブロックfinallyを指定する場合は、次のようにします。try

StreamWriter sw;

try
{
    sw = new StreamWriter(strFilePath, false);
}
catch
{
}
finally
{
    sw.Flush();
    sw.Close();
    sw.Dispose();        
}

これにより、スコープがになりfinallyます。

編集

Darinが指摘しているように、ファイルストリームにブロックを追加usingしてファイルを作成し、すでに行っているようにこのストリームに書き込むことができます。StreamWriter

using (FileStream fs = new FileStream(strFilePath, FileMode.Create, FileAccess.Write))
{
    using (StreamWriter sw = new StreamWriter(fs))
    {
        // write your content

        sw.Flush();
        sw.Close();
    }

    fs.Close();
}

コードに表示されているとおりにファイルを作成している場合File.Create(ただし、コメントアウトされている場合)、ファイルを閉じていないFileStreamため、これが要因である可能性があります。

于 2012-08-23T08:21:09.957 に答える
0

StreamWriter は範囲外になります。以下に屈折すると…

StreamWriter sw;
try
{
   sw = new StreamWriter(strFilePath, false);
}
Catch
{

}
finally
{
 sw.Flush();
 sw.Close();
 sw.Dispose();
}
于 2012-08-23T08:23:09.913 に答える
0

コードの最後のブロックでswは、範囲外であるため認識されません。

これを試してください:

 StreamWriter sw;

 try
 {
    sw = new StreamWriter(strFilePath, false);
 }
 catch
 {
    // Never do an empty catch BTW!    
 }
 finally
 {
   if (sw != null)
   {
     sw.Flush();
     sw.Close();
     sw.Dispose();
   }
}

または、さらに良いことに、using ステートメントを使用します。

using (StreamWriter sw = new StreamWriter(strFilePath, false))
{
    // Just do your thing, at the end sw will be cleaned up for you :)
}
于 2012-08-23T08:23:14.803 に答える
0

したがって、最初の試みは合理的だったようです(以下の要約)

using (var sw = new StreamWriter(strFilePath, false)) 
{ 
    sw.Flush();  
    sw.Close();  
    sw.Dispose();  
}

ただし、sw..Dispose() は using{} ブロック内にあるため必要ありません。

では、あなたが見ていた問題は正確には何でしたか?

わかりました、私はあなたの編集を見ました。おそらく添付ファイルなど、ファイルをロックしている何かではないでしょうか。これがどのスコープで宣言されているかわかりませんが、ファイルにぶら下がっている可能性はありますか? ロックしているものを確認したい場合は、ProcessMonitor を使用できます...

http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

于 2012-08-23T08:28:20.960 に答える