将下一行作为新命令传递

时间:2015-02-17 12:29:23

标签: c# sql-server csv stored-procedures

我想在.csv文件中打印存储过程的输出。 当我插入单个存储过程,例如
exec spGet Table 5 1,null,null,null,111,null,null,null,61,null,null,3;
连同它的参数一起执行。但是当我使用不同的参数多次传递相同的过程时,它只执行第一个存储过程,其余的被忽略。在CSV文件中,我只获得第一个SP输出。

我的代码如下

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void btnGetSku_Click(object sender, EventArgs e)
    {
        Stopwatch swra = new Stopwatch();
        swra.Start();

        StreamWriter CsvfileWriter = new StreamWriter(@"D:\testfile.csv");
        string connectionString = null;
        SqlConnection cnn;
        connectionString = "Data Source=My-PC-Name;Initial Catalog=MyDB;User            
        cnn = new SqlConnection(connectionString);
         ID=Name;Password=********";

        cnn.Open();

        SqlCommand cmd = new SqlCommand(textBox1.Text, cnn);
        cmd.CommandText = textBox1.Text;
        cmd.CommandType = CommandType.Text;
        cmd.CommandTimeout = 2000;
        using (cnn)
        {
            using (SqlDataReader rdr = cmd.ExecuteReader())
            using (CsvfileWriter)
            {
                //For getting the Table Headers
                DataTable Tablecolumns = new DataTable();

                for (int i = 0; i < rdr.FieldCount; i++)
                {
                    Tablecolumns.Columns.Add(rdr.GetName(i));
                }
                CsvfileWriter.WriteLine(string.Join(",",  
               Tablecolumns.Columns.Cast<DataColumn>().Select(csvfile =>   
               csvfile.ColumnName)));

                while (rdr.Read())
                {

                    label1.Text = rdr["SKU"].ToString() + " " +    
                       rdr["SKUCode"].ToString();
                    CsvfileWriter.WriteLine(rdr["SKU"].ToString() + "," + 
               rdr["SKUCode"].ToString() + "," + 
                   rdr["Compliance_Curr"].ToString() + "," + 
                  rdr["Compliance_Prev"].ToString() + "," + 
             rdr["Difference"].ToString() + "," + 
            rdr["TotalSales_Curr"].ToString() + ",");
                }
                cnn.Close();

            }
        }
        swra.Stop();
        Console.WriteLine(swra.ElapsedMilliseconds);
    }

}

我想确保每个过程的执行方式不同并附加到.csv文件中。

3 个答案:

答案 0 :(得分:0)

您是否尝试使用参数名称(在存储过程中声明)调用存储过程?

例如:EXECUTE spGet @Id = 1, @Number = 111, @....

答案 1 :(得分:0)

在你的代码中,你每次创建 StreamWriter对象**,你点击** btnGetSku ,尝试使它成为成员变量然后写。数据未被追加,

StreamWriter CsvfileWriter = null;

private void btnGetSku_Click(object sender, EventArgs e)
    {
    Stopwatch swra = new Stopwatch();
    swra.Start();

    if(CsvfileWriter == null)
       CsvfileWriter = new StreamWriter(@"D:\testfile.csv");
    string connectionString = null;
    SqlConnection cnn;
    connectionString = "Data Source=My-PC-Name;Initial Catalog=MyDB;User            
    cnn = new SqlConnection(connectionString);
     ID=Name;Password=********";

    cnn.Open();

    SqlCommand cmd = new SqlCommand(textBox1.Text, cnn);
    cmd.CommandText = textBox1.Text;
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandTimeout = 2000;
    using (cnn)
    {
        using (SqlDataReader rdr = cmd.ExecuteReader())
        // Don't use using here. This disposes the streams
        //using (CsvfileWriter)
        {
            //For getting the Table Headers
            DataTable Tablecolumns = new DataTable();

            for (int i = 0; i < rdr.FieldCount; i++)
            {
                Tablecolumns.Columns.Add(rdr.GetName(i));
            }
            CsvfileWriter.WriteLine(string.Join(",",  
           Tablecolumns.Columns.Cast<DataColumn>().Select(csvfile =>   
           csvfile.ColumnName)));

            while (rdr.Read())
            {

                label1.Text = rdr["SKU"].ToString() + " " +    
                   rdr["SKUCode"].ToString();
                CsvfileWriter.WriteLine(rdr["SKU"].ToString() + "," + 
           rdr["SKUCode"].ToString() + "," + 
               rdr["Compliance_Curr"].ToString() + "," + 
              rdr["Compliance_Prev"].ToString() + "," + 
         rdr["Difference"].ToString() + "," + 
        rdr["TotalSales_Curr"].ToString() + ",");
            }
            cnn.Close();

        }
    }
    swra.Stop();
    Console.WriteLine(swra.ElapsedMilliseconds);
}

答案 2 :(得分:0)

您遇到的问题是每次都要覆盖文件。所以你所拥有的实际上是上次执行命令的结果。

罪魁祸首是以下几行:

StreamWriter CsvfileWriter = new StreamWriter(@"D:\testfile.csv");

根据documentation

  

如果文件存在,则会被覆盖;否则,将创建一个新文件。

您需要使用overload StreamWriter构造函数,该构造函数接受bool值,指定是附加到文件还是覆盖它。

var csvFileWriter = new StreamWriter(@"D:\testfile.csv", true);