2013-08-01 4 views
1

Я пытаюсь прочитать строку информации из БД и записать это в файл txt. Я многое из этого понял, но я получаю следующую ошибку: «Инициализатор поля не может ссылаться на нестатические поля, метод или свойство« reader_writer.filewriter.filePath », и я не знаю почему. Может кто-нибудь объяснить мою проблему?Запись информации SQL в файл TXT

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(); 
    } 
} 

}

+0

Возможный дубликат [Инициализатор поля не может ссылаться на нестатическое поле, метод или свойство?] (Http://stackoverflow.com/questions/7400677/a-field-initializer-cannot-reference-the-non -static-полевой метод или свойство-) –

ответ

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(); 
    } 
0

Установить переменную dbFile внутри метода Main(string[] args). Это не будет работать в декларации класса.

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

Есть причина, почему вы определяете Filepath, а затем только использовать его для определения DBFILE?

0

Проблема заключается в том, что ваш dbFile объявлен как поле (переменная экземпляра) вашего класса. Но Писатель не создается при инициализации.

Указанная вами ошибка возникает, когда вы объявляете и устанавливаете переменную уровня класса нестатистическому значению. Они не могут использоваться для инициализации другого поля. Как вы делаете в

StreamWriter writer = File.CreateText(dbFile); 

Вы не можете использовать переменную экземпляра для инициализации другой переменной экземпляра. Компилятор может изменить их.

Нет гарантии, что dbfile будет инициализирован до записи.

Инициализация резервных полей к постоянным значениям или к простому новому утверждению.

Смежные вопросы