2011-09-13 35 views
6

Tôi cố gắng để lấy dữ liệu từ cơ sở dữ liệu bằng cách sử dụng mã dưới đây .....vấn đề với nhận dữ liệu từ cơ sở dữ liệu

nếu không có dữ liệu trong bảng nó sẽ luôn luôn đi vào tuyên bố này

tôi đang sử dụng kết nối mysql.net để nhận được dữ liệu và tôi đang làm winforms ứng dụng sử dụng 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); 
    } 

và mã dưới đây là sự trở lại sqlexceution ... chức năng ..

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; 
    } 

ngay cả khi không có dữ liệu dòng chảy quá trình sẽ đi vào dòng này

bảng = ds.Tables [0];

làm thế nào tôi có thể giảm này .....

sẽ bất kỳ một pls giúp đỡ về vấn đề này ....

+0

tại sao ru cho xuống bỏ phiếu ... –

+0

Bạn đã xem là sử dụng một ví dụ ORM LINQ to SQL Entities hoặc EF? – James

+0

không .. tôi phải sử dụng cái này .... –

Trả lời

4

Trong trường hợp của bạn nếu bạn đang nghĩ rằng khối catch sẽ được excuted nếu có không có hàng nào có sẵn hơn bạn sai bởi vì Ngay cả khi không có dữ liệu khi truy vấn chọn được lấy ra mà không có ngoại lệ, nó sẽ tạo dữ liệu với các cột nhưng không có hàng.

cho điều này tôi nghĩ bạn có thể sử dụng thuộc tính ds.table[0].rows.count để trả về 0 nếu không có hàng trong dữ liệu có thể định.

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

Thuộc tính Hàng của DataTable là null khi không có hàng: http://msdn.microsoft.com/en-US/library/system.data.datatable.rows.aspx – stuartd

+1

@Stuart Dunkeld - tốt hơn là bạn chạy mã và kiểm tra xem nó ra bằng cách tự của bạn và nếu có thể loại bỏ downvote của bạn một khi bạn thực hiện với việc kiểm tra –

+0

Là tài liệu MSDN không chính xác hoặc gây hiểu nhầm? – stuartd

3

Nó trả về một bảng trống. Đây là hành vi phổ biến. Nếu bạn muốn có bảng rỗng bạn nên kiểm tra cho hàng đếm:

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

Rất cám ơn ...sascha làm việc của nó bây giờ –

3

Tôi không thực sự chắc chắn những gì bạn đang yêu cầu ở đây ... Tôi giả sử bạn muốn nó bỏ qua bảng = ds.tables [0] dòng nếu không có dữ liệu?

nếu thats trường hợp một try/catch sẽ không làm việc vì nó sẽ không ném một ngoại lệ ... thử một cái gì đó như thế này thay vì ...

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

Rất cám ơn ........ –

Các vấn đề liên quan