将SQL信息写入TXT文件

时间:2013-08-01 17:41:26

标签: c# sql syntax-error streamwriter

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

}

5 个答案:

答案 0 :(得分: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();
    }

答案 1 :(得分:1)

string dbFile = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\sqlfile.txt";

您是否有理由定义filePath,然后仅使用它来定义dbFile?

答案 2 :(得分:0)

dbFile方法中设置Main(string[] args)变量。它不适用于类声明。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

StreamWriter writer = File.CreateText(dbFile);

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

无法保证在编写之前初始化dbfile。

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