1

次のプログラムを使用して、ftpサーバー上のフォルダーにリストされているすべてのファイル名をSQLテーブルに挿入しようとしています。

テーブルへの書き込み中にエラーが発生します

c#は破棄されたオブジェクトにアクセスできません。オブジェクト名'system.net.sockets.networkstream'

reader.ReadToEnd()ファイル名を1つずつ必要な場所にストリーム全体を書き込みます。

namespace Examples.System.Net
{
    public class WebRequestGetExample
    {
        public static void Main()
        {

            FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://myftpaddress.com/0708/");
            request.Method = WebRequestMethods.Ftp.ListDirectory;


            request.Credentials = new NetworkCredential("vish10", "MyPasswd");

            FtpWebResponse response = (FtpWebResponse)request.GetResponse();

            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);
            Console.WriteLine(reader.ReadToEnd());

            SqlConnection sqlConnection1 = new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DMSTG;Data Source=.");
            SqlCommand cmd = new SqlCommand();

            cmd.CommandText = @"Insert into FTPfileList0708Folder
                                           values('" + reader.ReadToEnd().ToString() + "')";
            cmd.Connection = sqlConnection1;

            sqlConnection1.Open();

            cmd.ExecuteNonQuery();
            sqlConnection1.Close();

            Console.WriteLine("Directory List Complete, status {0}", response.StatusDescription);

            reader.Close();
            response.Close();
        }
    }
}
4

1 に答える 1

1

あなたはすでにここで完全な応答を読んだ:

FtpWebResponse response = (FtpWebResponse)request.GetResponse();

Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
Console.WriteLine(reader.ReadToEnd());

一度読んだら、二度と読むことはできません。

に変更するだけ

string text = reader.ReadToEnd();

using...次に、リソースを適切に処理するための適切なステートメントを追加します。

string text;
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
    using (Stream responseStream = response.GetResponseStream())
    {
        // No need to dispose of the StreamReader as we're already
        // disposing of the stream. It wouldn't do any harm though.
        // Is the text definitely encoded in UTF-8 though?
        text = new StreamReader(responseStream).ReadToEnd();
    }
}

SQL関連のすべてのリソースに対して同様usingのステートメントが必要です。それは当面の問題を解決します-しかし、それがファイル名を読むという特定のビジネスと何の関係があるのか​​は明らかではありません。これは、ファイル名がテキスト内でどの形式になっているのかによって異なります。私が覚えていることから、この種のことに関しては、FTPは実際には非常に不十分に指定されています。

2つの重要な変更をお勧めします。

  • コードを論理メソッドに分割します。
    • FTPリクエスト自体の処理
    • データを適切な形式に解析する
    • データベースへのデータの挿入
  • あなたのために解析を行う方法を知っているより高いレベルのFTPライブラリを見つけてみてください
于 2012-08-30T06:00:33.903 に答える