2011-09-13 31 views
6

我试图通过使用下面的代码从数据库中的数据中获取数据.....问题,从数据库

如果在表中没有数据,它会永远去 这种说法

我使用mysql.net连接器用于获取数据,我使用C#

 public DataTable sales(DateTime startdate, DateTime enddate) 
    { 
     const string sql = @"SELECT memberAccTran_Source as Category, sum(memberAccTran_Value) as Value 
           FROM memberacctrans 
           WHERE memberAccTran_DateTime BETWEEN @startdate AND @enddate 
           GROUP BY memberAccTran_Source"; 

     return sqlexecution(startdate, enddate, sql); 
    } 

做的WinForms应用 和下面的代码是回报sqlexceution ... ..功能

private static DataTable sqlexecution(DateTime startdate, DateTime enddate, string sql) 
{ 
     var table = new DataTable(); 
     using (var conn = new MySql.Data.MySqlClient.MySqlConnection(connectionstring)) 
     { 
      conn.Open(); 

      var cmd = new MySql.Data.MySqlClient.MySqlCommand(sql, conn); 

      var ds = new DataSet(); 

      var parameter = new MySql.Data.MySqlClient.MySqlParameter("@startdate", MySql.Data.MySqlClient.MySqlDbType.DateTime); 
      parameter.Direction = ParameterDirection.Input; 
      parameter.Value = startdate.ToString(dateformat); 
      cmd.Parameters.Add(parameter); 

      var parameter2 = new MySql.Data.MySqlClient.MySqlParameter("@enddate", MySql.Data.MySqlClient.MySqlDbType.DateTime); 
      parameter2.Direction = ParameterDirection.Input; 
      parameter2.Value = enddate.ToString(dateformat); 
      cmd.Parameters.Add(parameter2); 

      var da = new MySql.Data.MySqlClient.MySqlDataAdapter(cmd); 

      da.Fill(ds); 
      try 
      { 
       table = ds.Tables[0]; 

      } 
      catch 
      { 
       table = null; 
      } 
     } 
     return table; 
    } 

即使没有数据的处理的流程进到这一行

表= ds.Tables [0];

我怎样才能减少这种.....

将在此任何一个请帮助....

+0

为什么る给予下来票... –

+0

你有没有考虑使用一个ORM例如Linq到SQL实体还是EF? – James

+0

不..我必须使用这个.... –

回答

4

你的情况,如果你认为catch块将得到excuted如果有是没有可用的行比你错了,因为即使没有数据一旦选择查询得到毫无例外的情况下它创建数据表与列但没有行。

为此,我认为你可以使用ds.table[0].rows.count属性,如果数据表中没有行,则返回0。

if (ds.Tables[0].Rows.Count > 0) 
    table = ds.Tables[0]; 
else 
    table=null; 
+0

当没有行时,DataTable的Rows属性为null:http://msdn.microsoft.com/en-US/library/system.data.datatable.rows.aspx – stuartd

+1

@Stuart Dunkeld - 它更好地运行代码并且检查一下你的自我,如果可能的话,一旦你完成了检查,取消你的downvote –

+0

MSDN文档不正确或误导? – stuartd

3

它返回一个空表。这是常见的行为。如果你想有,你应该检查该行的表空计数:

If (ds.Tables[0].Rows.Count >. 0) 
    table = ds.Tables[0]; 
Else 
    table=0 
+0

非常感谢...sascha现在的工作 –

3

我真的不知道你问这里有什么......我想,你希望它跳过表= ds.tables [0]行如果没有数据?

如果多数民众赞成的情况下一个try/catch不会工作,因为它不会抛出一个异常...尝试这样的事情,而不是...

if(ds.Tables.Count > 0 && ds.Tables[0].Rows.Count >0) 
{ 
    table = ds.Tables[0]; 
} 
else 
{ 
    table = null; 
} 
+0

非常感谢........ –