2016-06-25 14 views
0

这是问题所在。我不得不写一份长长的复杂的报告。我不认为我可以只使用C#,所以我认为最好的东西是一个临时SQL表。所以我写了这段代码,我总是没有行,我知道表中有数据。复杂的报表需要SQL临时文件C#返回无行

 SqlConnection connection = new SqlConnection(connectionString); 
     SqlCommand cmd = new SqlCommand(); 
     SqlDataReader reader; 

     cmd.CommandText = "SELECT * INTO ##temp FROM Customers"; 
     cmd.Connection = connection; 
     connection.Open(); 

     reader = cmd.ExecuteReader(); 

     if (reader.HasRows) 
     { MessageBox.Show("ROWS"); } 
     else 
     { MessageBox.Show("NO ROWS"); } 

     connection.Close(); 

所以我想,也许我需要另一个读者SELECT * FROM ## TEMP但它总是崩溃告诉我,我的读者已经打开(我用读卡器= cmd.ExecuteReader();)。请帮忙。

+0

是什么“撞车”呢?如果你没有行,那么没有结果集行。因为你选择*到一个临时表,我不知道为什么结果行甚至会被期望。显然不是在选择*到临时表时发出结果集的行为,这可以通过在SSMS中运行查询来证明。 – user2864740

+0

好的 - 你说得对。当我开始发布帖子时它崩溃了,但我修复了它。我把标题改为这个问题。你认为你可以帮助解决我的问题吗?如何从临时文件获取行? – Missy

+0

我回滚了你的编辑。如果您发现您认为会使未来读者受益的解决方案,请使用标题*您的答案*下方的空格并放在那里。 [完全可以接受](http://stackoverflow.com/help/self-answer)。 –

回答

0

我找到了答案:

 cmd.Connection = connection; 
     connection.Open(); 
     cmd.ExecuteNonQuery(); 
     cmd.CommandText = "SELECT * from ##temp"; 
     reader = cmd.ExecuteReader(); 

首先运行的ExecuteNonQuery,然后更改命令然后运行的ExecuteReader

0

你的问题未能证明使用临时表。真的没有理由不直接从实际的表中读取数据(除非您的问题省略了重要的相关细节)。

此外,最好还是习惯于使用using块来处理db对象,即使在发生异常时也能正确清理。

这里是代码可能是什么样子:

using (var connection = new SqlConnection(connectionString)) 
{ 
    using (var cmd = new SqlCommand("SELECT * FROM Customers", connection)) 
    { 
     connection.Open(); 

     using (var reader = cmd.ExecuteReader()) 
     { 
      if (reader.HasRows) 
      { 
       MessageBox.Show("ROWS"); 
      } 
      else 
      { 
       MessageBox.Show("NO ROWS"); 
      } 
     } 
    } 
} 
+0

这真的很有趣,你认为我不应该使用临时表。以下是报告的范围:它将被复制到包含约10个工作表的工作簿中 - 每个工作表包含约1000行和约30列。我认为这是太多的数据,以保留在记忆中,但我没有经历过,所以我非常喜欢你的意见,不管它是否为什么。 – Missy