将 SELECT 查询的结果保存到另一个表

我有一个 SQL 查询,使用 Visual Studio 查询窗口生成在其下方找到的结果:


SELECT SUM(TaskLength) AS TaskLength 

FROM myTable 

WHERE EventStartTime BETWEEN '2019/8/17' AND '2019/8/19' 

GROUP BY TaskName 

ORDER BY TaskLength

查询结果窗口产生以下内容:


TaskName        TaskLength

--------------------------

Idle Time        20

Start Shift      31

Downtime         85

Engineering     120

Part Prep       141

Maintenance     172

Production      417 

我下面的 C# 代码仅返回一个字符串,表示一行中的一列。


using (SqlConnection con = new SqlConnection(_connectionString))

{

     string query = @"SELECT SUM(TaskLength) AS TaskLength 

                      FROM myTable 

                      WHERE EventStartTime BETWEEN '2019/8/17' AND '2019/8/19' 

                      GROUP BY TaskName 

                      ORDER BY TaskLength";


     using (SqlCommand cmd = new SqlCommand(query, con))

     {

          con.Open();

          object result = cmd.ExecuteScalar();

          string totalMinutes = Convert.ToString(result);

     }

}

返回的对象是否cmd.ExecuteScalar代表整个结果表?


如果没有,还有其他方法可以做到这一点。我的想法是将结果保存到中间表(如果还没有这样做)并将其保存到那里的 .csv 文件,除非有更好的方法。


慕慕森
浏览 134回答 1
1回答

陪伴而非守候

ExecuteScalar仅返回第一行的第一列。如果您有很多行要读取,那么您需要调用ExecuteReader并使用返回的值进行循环,SqlDataReader.Read直到返回 false。循环时,您将查询结果存储在某种列表中,创建与读取器返回的信息相匹配的对象。然后,这个列表可以很容易地用作某种用户界面对象(如 DataGridView 或类似对象)的数据源,或者用于将数据写入文件或其他存储。// The model that describes the data returned by the querypublic class TaskData{    public string Name {get;set;}    public int Length {get;set;}} ..... // Where you store each record retrieved by the queryList<TaskData> results = new List<TaskData>();using (SqlConnection con = new SqlConnection(_connectionString)){   // Added the taskname to the query   string query = @"SELECT TaskName, SUM(TaskLength) as TaskLength                   FROM myTable                   WHERE EventStartTime                   BETWEEN '2019/8/17' AND '2019/8/19'                   GROUP BY TaskName ORDER BY TaskLength";   using (SqlCommand cmd = new SqlCommand(query, con))   {      con.Open();      // Get a reader to loop over the results      using(SqlDataReader reader = cmd.ExecuteReader())      {          // Start reading data (until there are no more records to read)          while(reader.Read())          {               // From the current record build the TaskData info               TaskData data = new TaskData               {                   Name = reader["TaskName"].ToString(),                   Length = Convert.ToInt32(reader["TaskLength"]);               }               // Add this info the the collection of your results               results.Add(data);          }      }   }}现在,如果您想将结果存储到 CSV 文件中,代码很简单File.WriteAllLines("yourFile.csv",       string.Join(Environment.NewLine,              results.Select(x => x.Name +","+x.Length))
打开App,查看更多内容
随时随地看视频慕课网APP