2014-01-16 25 views
0

我基本上有一个存储过程中,我通过一个方法调用:存储过程返回一个临时表,我需要转换成CSV文件

Time_Tracker.BLL.ResultsManager.GetCSV(Convert.ToDateTime("2014-01-11")); 

它返回数据,从25至150个记录的8列。

我需要能够将其转换为CSV文件以供用户选择的路径。我能够将它作为一个数组放入我的代码中(Results[] TEST = new Results[25];),并已验证数据是否为O.K.我看到很多帖子,他们使用DataTable作为源来转换为CSV,但我不知道如何从调用存储过程的方法加载DataTable。与DataGridView一样,不确定如何将数据加载到DataGridView

我也看到他们使用方法SqlDataAdapter来填充DataTable。由于我使用的是直接使用存储过程的方法,因此我不想每次都使用SqlDataAdapter并提供数据库配置信息。

如果有人可以帮我把它加载到DataTableDataGridView,我想我可以从那里弄清楚。

预先感谢您。

埃里克

+0

你需要在你的程序中的数据处理任何程度超过从数据库传递到CSV文件?数据中可能有NULL值吗?数据中可能有逗号吗? –

回答

0

只要定义一个数据表,并使用负载命令从读取器到数据表的数据移动。

http://msdn.microsoft.com/en-us/library/d7125bke.aspx

这是直接从MSDN。我添加了两行来加载数据表。

-- Code from msdn 
SqlConnection sqlConnection1 = new SqlConnection("Your Connection String"); 
SqlCommand cmd = new SqlCommand(); 


cmd.CommandText = "StoredProcedureName"; 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Connection = sqlConnection1; 

sqlConnection1.Open(); 

SqlDataReader reader = cmd.ExecuteReader(); 

-- This is my addition 
DataTable dt = new DataTable(); 
dt.Load(reader); 

sqlConnection1.Close(); 

我还是不明白你在做什么。您可以通过编码创建一个数据表,xml记录集。

下面的代码可用于将数组转换为DataTable。您需要做一些工作来添加您的详细信息。

http://msdn.microsoft.com/en-us/library/skef0k7a(v=vs.110).aspx

// Create sample Customers table. 
DataTable table = new DataTable(); 
table.TableName = "Customers"; 

// Create two columns, ID and Name. 
DataColumn idColumn = table.Columns.Add("ID", typeof(int)); 
table.Columns.Add("Name", typeof(string)); 

// Set the ID column as the primary key column. 
table.PrimaryKey = new DataColumn[] { idColumn }; 

table.Rows.Add(new object[] { 0, "Mary" }); 
table.Rows.Add(new object[] { 1, "Andy" }); 
table.Rows.Add(new object[] { 2, "Peter" }); 
table.AcceptChanges(); 
return table; 

我希望这有助于。如果不是,我仍然没有得到业务要求。

0

我现在可以从Datatable(谢谢)创建一个CSV文件。 我现在面临的问题是其中一列是SQL中的DATE,但是C#中的DateTime, 因此它包括时间(2014年1月17日12:00:00 AM)以及日期。 如果您查看下面的代码,我可以检测到时间组件仍然附加的日期。但是,我似乎无法将其解析为写入CSV文件的日期。任何帮助,将不胜感激 !

这里是我落得这样做:

保护无效btnCSV_Click(对象发件人,EventArgs的)

{

的SqlConnection sqlConnection1 =新的SqlConnection(DAL.DBUtils。SqlConnectionString);

 SqlCommand cmd = new SqlCommand(); 

     cmd.CommandText = "[dbo].[usp.CSV_OUT]"; 

     cmd.CommandType = CommandType.StoredProcedure; 

     cmd.Parameters.AddWithValue("@DateBeg", "2014-01-11"); 

     cmd.Connection = sqlConnection1; 

     sqlConnection1.Open(); 

     SqlDataReader reader = cmd.ExecuteReader(); 

     DataTable dt = new DataTable(); 

     dt.Load(reader); 

     sqlConnection1.Close(); 

     ExportToCSV(dt, @"C:\Users\eric.dahlenburg\Documents\Visual Studio 2010\Projects\", "csvData.csv"); 
    } 

    public static void ExportToCSV(DataTable dt, string strFilePath, string fileName) 
    { 
     var sw = new StreamWriter(strFilePath + fileName, false); 
     // Write the headers. 
     int iColCount = dt.Columns.Count; 
     for (int i = 0; i < iColCount; i++) 
     { 
      sw.Write(dt.Columns[i]); 
      if (i < iColCount - 1) sw.Write(","); 
     } 
     sw.Write(sw.NewLine); 
     // Write rows. 
     foreach (DataRow dr in dt.Rows) 
     { 
      for (int i = 0; i < iColCount; i++) 
      { 
       if (dr[i] is DateTime) 
       { 
        if (((DateTime)dr[i]).TimeOfDay.TotalSeconds == 0) // Time Since Midnight (in Seconds) 
        { 
         dr[i] = ((DateTime)dr[i]).ToString("yyyy-MM-dd"); 
        } 
        else 
        { 
         dr[i] = ((DateTime)dr[i]).ToString("yyyy-MM-dd HH:mm:ss"); 
        } 
       } 

       if (!Convert.IsDBNull(dr[i])) 
       { 
        if (dr[i].ToString().StartsWith("0")) 
        { 
         sw.Write(@"=""" + dr[i] + @""""); 
        } 
        else 
        { 
         sw.Write(dr[i].ToString()); 
        } 
       } 

       if (i < iColCount - 1) sw.Write(","); 
      } 
      sw.Write(sw.NewLine); 
     } 
     sw.Close(); 
    } 
0

我想通了(见下文)。我会将此标记为已解决,并再次感谢您的帮助!

 foreach (DataRow dr in dt.Rows) 
     { 
      for (int i = 0; i < iColCount; i++) 
      { 
       if (!Convert.IsDBNull(dr[i])) 
       { 
        if (dr[i] is DateTime) 
        { 
         if (((DateTime)dr[i]).TimeOfDay.TotalSeconds == 0) // Time Since Midnight (in Seconds) 
         { 
          sw.Write(((DateTime)dr[i]).ToString("yyyy-MM-dd")); 
         } 
        } 

        else 
        { 
         sw.Write(dr[i].ToString()); 
        } 
       } 

       if (i < iColCount - 1) sw.Write(","); 
      } 
      sw.Write(sw.NewLine); 
     } 
+0

我没有看到将帖子标记为已回答的链接。有人可以关闭此线程吗?谢谢 ! – pmcs

0

这里是我最终做了别人寻求帮助:

protected void btnCSV_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      // HATE EXPOSING THE DATABASE CONNECTION THIS WAY !!! 
      SqlConnection sqlConnection1 = new SqlConnection(DAL.DBUtils.SqlConnectionString); 
      SqlCommand cmd = new SqlCommand(); 
      cmd.CommandText = "[dbo].[usp.CSV_OUT]"; 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.AddWithValue("@DateBeg", Time_Tracker.Utilities.TimeCard_Start_Date()); 
      cmd.Connection = sqlConnection1; 
      sqlConnection1.Open(); 
      SqlDataReader reader = cmd.ExecuteReader(); 
      DataTable dt = new DataTable(); 
      dt.Load(reader); 
      sqlConnection1.Close(); 
      ExportToCSV(dt, ConfigurationManager.AppSettings["CSVPath"].ToString(), "CSV_Hours_Data_" + Time_Tracker.Utilities.TimeCard_Start_Date().AddDays(+6).ToString("MM_dd_yyyy") + ".csv"); 
     } 
     catch (Exception ex) 
     { 
      Utilities.ErrorLog(ex.Message, ex.GetType().ToString(), ex.StackTrace, @"Time_Tracker.txt"); 
     } 
    } 


    public static void ExportToCSV(DataTable dt, string strFilePath, string fileName) 
    { 
     try 
     { 
      var sw = new StreamWriter(strFilePath + fileName, false); 
      // Write the headers. 
      int iColCount = dt.Columns.Count; 
      for (int i = 0; i < iColCount; i++) 
      { 
       sw.Write(dt.Columns[i]); 
       if (i < iColCount - 1) sw.Write(","); 
      } 
      sw.Write(sw.NewLine); 
      // Write rows. 
      foreach (DataRow dr in dt.Rows) 
      { 
       for (int i = 0; i < iColCount; i++) 
       { 
        if (!Convert.IsDBNull(dr[i])) 
        { 
         string output = dr[i].ToString(); 

         if (dr[i] is DateTime) 
         { 
          if (((DateTime)dr[i]).TimeOfDay.TotalSeconds == 0) // Time Since Midnight (in Seconds) 
          { 
           output = (((DateTime)dr[i]).ToString("yyyy-MM-dd")); 
          } 
         } 
         if (output.Contains(";") || output.Contains("\"")) 
          output = '"' + output.Replace("\"", "\"\"") + '"'; 
         if (Regex.IsMatch(output, @"(?:\r\n|\n|\r)")) 
          output = string.Join(" ", Regex.Split(output, @"(?:\r\n|\n|\r)")); 
         sw.Write(output); 
        } 

        if (i < iColCount - 1) sw.Write(","); 
       } 
       sw.Write(sw.NewLine); 
      } 
      sw.Close(); 
      // Causes Save As Dialog box to appear for user. 
      String FileName = fileName; 
      String FilePath = strFilePath; 
      System.Web.HttpResponse response = System.Web.HttpContext.Current.Response; 
      response.ClearContent(); 
      response.Clear(); 
      response.ContentType = "text/plain"; 
      response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + ";"); 
      response.TransmitFile(FilePath + FileName); 
      response.Flush(); 
      response.End(); 

     } 
     catch (Exception ex) 
     { 
      Utilities.ErrorLog(ex.Message, ex.GetType().ToString(), ex.StackTrace, @"Time_Tracker.txt"); 
     } 
    }