C# C将sql查询写入文件?

C# C将sql查询写入文件?,c#,sql,save,streamwriter,C#,Sql,Save,Streamwriter,我想将sql查询写入文件,但只能在文本文件中写入查询的一列。如何添加更多列 这是我的c windows窗体代码: SqlConnection con = new SqlConnection(@"Data Source=" + globalvariables.hosttxt + "," + globalvariables.porttxt + "\\SQLEXPRESS;Database=ha;Persist Security Info=false; UID='" + globalvariables

我想将sql查询写入文件,但只能在文本文件中写入查询的一列。如何添加更多列

这是我的c windows窗体代码:

SqlConnection con = new SqlConnection(@"Data Source=" + globalvariables.hosttxt + "," + globalvariables.porttxt + "\\SQLEXPRESS;Database=ha;Persist Security Info=false; UID='" + globalvariables.user + "' ; PWD='" + globalvariables.psw + "'");
SqlCommand command = con.CreateCommand();

command.CommandText = "Select * from bestillinger";
con.Open();
SqlDataReader queryReader = command.ExecuteReader();

while (queryReader.Read())
{
    StreamWriter file = new StreamWriter(@"C:\Users\Michael\Desktop\query.txt");
    file.WriteLine(queryReader["ordrenr"]);

    file.Close();

}

queryReader.Close();
con.Close();
它不允许我写:

file.WriteLine(queryReader["ordrenr"] + queryReader["user"]);
我找到了一个方法:

file.WriteLine("{0},{1}", queryReader["ordrenr"], queryReader["user"]);

这是工作,你应该首先使对象字符串,你还需要关闭文件在最后。不是第一次迭代

我现在认识到这个六岁的孩子了,但当我在自己的搜索中发现这个问题时,我觉得提供一个稍微干净一点的答案对其他人也有好处。另外,我还不能发表评论,所以我想我还是把这个作为一个答案来提交吧

正如Magus在评论中指出的那样,OP的答案提出了一个相当大的性能问题,即用每一行重新创建流

同时,mybirthname的答案实际上永远不会添加标题行,如果在创建时将包含的bool更改为true,则会生成一个只填充标题的文件

在这个特殊的例子中,我以逗号分隔的值格式写出数据。如果您想在以后在电子表格编辑器中打开此文件,则文件扩展名可以是.csv;如果任何最终用户都不想查看此文件,则文件扩展名可以是.txt

//Consider putting your connection string in a config file and referencing it here.
SqlConnection sqlConn = new SqlConnection(Properties.Settings.Default.ConnString);

//If possible, avoid using "Select *" and instead, select only the columns you care about to increase efficiency.
SqlCommand sqlCmd = new SqlCommand("Select ordrenr, user From bestillinger", sqlConn);

sqlConn.Open();
SqlDataReader sdr = sqlCmd.ExecuteReader();

if (sdr.HasRows)
{
    //There's really no reason to create the StreamWriter unless you actually find some data.
    StreamWriter swExportWriter = new StreamWriter(@"C:\DataStore\Datafile.csv");

    //Now that you know you have data, go ahead and write the first line to the file as the header row.
    swExportWriter.WriteLine("ordrenr, user");

    //Now use SqlDataReader.Read() to loop through the records and write each one to the file.
    while (sdr.Read())
    {            
        swExportWriter.WriteLine("{0},{1}", sdr["ordrenr"], sdr["user"]);
    }
    //Don't forget to close the StreamWriter!
    swExportWriter.Close();
}
sdr.Close();
sqlConn.Close();
如果您想使用Using语句,根据Magus的建议,这可能是一个好主意,您也可以这样构造它:

using (SqlConnection sqlConn = new SqlConnection(Properties.Settings.Default.ConnString))
{
    SqlCommand sqlCmd = new SqlCommand("Select ordrenr, user From bestillinger", sqlConn)

    sqlConn.Open();
    using (SqlDataReader sdr = sqlCmd.ExecuteReader())
    {
        if (sdr.HasRows)
        {        
            using (StreamWriter swExportWriter = new StreamWriter(@"C:\DataStore\Datafile.csv"))
            {
                swExportWriter.WriteLine("ordrenr, user");

                while (sdr.Read())
                {            
                    swExportWriter.WriteLine("{0},{1}", sdr["ordrenr"], sdr["user"]);
                }
            }    
        }
    }
}

如果您遇到异常,请将其包含在您的问题中。我建议您研究using关键字,而不是在循环的每次迭代中都重新创建流。您可以为列添加标题吗?@user3888775您所说的列标题是什么意思,我不明白你的意思,如果文件被保存为csv格式,它会得到表列titles@user3888775在这里,我在while循环中进行了编辑检查。如果没有什么你可以接受的了。
using (SqlConnection sqlConn = new SqlConnection(Properties.Settings.Default.ConnString))
{
    SqlCommand sqlCmd = new SqlCommand("Select ordrenr, user From bestillinger", sqlConn)

    sqlConn.Open();
    using (SqlDataReader sdr = sqlCmd.ExecuteReader())
    {
        if (sdr.HasRows)
        {        
            using (StreamWriter swExportWriter = new StreamWriter(@"C:\DataStore\Datafile.csv"))
            {
                swExportWriter.WriteLine("ordrenr, user");

                while (sdr.Read())
                {            
                    swExportWriter.WriteLine("{0},{1}", sdr["ordrenr"], sdr["user"]);
                }
            }    
        }
    }
}