我试图从数据库中读取一行信息并将其写入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();
}
}
}
答案 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。
将字段初始化保留为常量值或简单的新语句。