1

DB から情報の行を読み取り、それを txt ファイルに書き込もうとしています。私はそのほとんどを理解しましたが、「フィールド初期化子は非静的フィールド、メソッド、またはプロパティ 'reader_writer.filewriter.filePath' を参照できません」というエラーが表示され、その理由がわかりません。誰かが私の問題を説明してもらえますか?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data.SqlClient;
using System.Data.Common;

namespace reader_writer
{
public class filewriter
{

    //public string filePath = "";
    bool fileExists = false;
    string filePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
    string dbFile = filePath + @"\sqlfile.txt";

    public void Main(string[] args)
    {


        fileExists = File.Exists(dbFile);

        if (fileExists)
        {
            writeFileFromDB();
        }

        else
        {
            File.Create(dbFile);
            writeFileFromDB();
        }

    }


    public void writeFileFromDB()
    {
        //create connection
        SqlCommand comm = new SqlCommand();
        comm.Connection = new SqlConnection(@"MY DB CONNECTION STRING");
        String sql = @"SELECT ROW1, ROW2
                           FROM Export.TABLENAME";

        comm.CommandText = sql;
        comm.Connection.Open();

        SqlDataReader sqlReader = comm.ExecuteReader();

        while (sqlReader.Read())
        {
            StreamWriter writer = File.CreateText(dbFile);
            writer.WriteLine(sqlReader["ROW1"] + "\t" + sqlReader["ROW2"]);
            writer.Close();
        }

        sqlReader.Close();
        comm.Connection.Close();
    }
}

}

4

5 に答える 5

2

これは、動作するだけでなく、少しクリーンアップしたバージョンです。問題を引き起こしていたより広い範囲の変数から逃れます。それを作成するファイルに書き込む方法を使用するため、既に存在するかどうかを検出する必要はありません。ROW1 から ROW2 の名前を実際の列に変更します。また、行を書き込むたびにファイルを開いたり閉じたりする必要がないようにします。

   static void Main(string[] args)
    {
        string filePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        string dbFile = filePath + @"\sqlfile.txt";

        writeFileFromDB(dbFile);
    }

    public static void writeFileFromDB(string dbFile)
    {
        //create connection
        SqlCommand comm = new SqlCommand();
        comm.Connection = new SqlConnection(@"MY DB CONNECTION STRING");
        String sql = @"SELECT COLUMN1, COLUMN2
                       FROM Export.TABLENAME";

        comm.CommandText = sql;
        comm.Connection.Open();

        SqlDataReader sqlReader = comm.ExecuteReader();

        // Open the file for write operations.  If exists, it will overwrite due to the "false" parameter
        using (StreamWriter file = new StreamWriter(dbFile, false))
        {
            while (sqlReader.Read())
            {
                file.WriteLine(sqlReader["COLUMN1"] + "\t" + sqlReader["COLUMN2"]);
            }
        }

        sqlReader.Close();
        comm.Connection.Close();
    }
于 2013-08-01T18:10:39.543 に答える
1
string dbFile = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\sqlfile.txt";

filePath を定義し、それを使用して dbFile を定義する理由はありますか?

于 2013-08-01T18:01:37.080 に答える
0

メソッドdbFile内に変数を設定します。Main(string[] args)クラス宣言では機能しません。

于 2013-08-01T17:59:06.243 に答える
0

メソッドを使用するか、フィールドを static にしないと、インスタンス フィールドを参照できません。

MSDN リファレンスを参照してください: http://msdn.microsoft.com/en-us/library/5724t6za(v=vs.80).aspx

于 2013-08-01T17:59:20.707 に答える