1

我试图从数据库中读取一行信息并将其写入 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

如果不使用方法或将字段设为静态,则无法引用实例字段。

请参阅 MSDN 参考: http: //msdn.microsoft.com/en-us/library/5724t6za (v=vs.80).aspx

于 2013-08-01T17:59:20.707 回答
0

问题似乎是您的 dbFile 被声明为您的类的字段(实例变量)。但是 Writer 在初始化的时候并没有被实例化。

当您声明类级变量并将其设置为非静态值时,会发生您提到的错误。它们不能用于初始化另一个字段。就像你在做

StreamWriter writer = File.CreateText(dbFile);

您不能使用实例变量来初始化另一个实例变量。编译器可以重新排列这些。

不能保证 dbfile 会在 writer 之前初始化。

将字段初始化保留为常量值或简单的新语句。

于 2013-08-01T18:23:54.803 回答