2011-09-13 6 views
6

Próbuję uzyskać dane z bazy danych za pomocą poniższego kodu .....Problem pobierania danych z bazy danych

jeśli nie ma żadnych danych w tabeli będzie zawsze idzie do to stwierdzenie

Używam złącze mysql.net uzyskania danych i robię winForms aplikacji użyciu 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); 
    } 

i poniżej kod jest na powrót sqlexceution ... funkcji ..

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

nawet, jeśli nie ma danych wola strumień procesowy przejdzie do tej linii

Tabela = ds.Tables [0];

jak mogę zmniejszyć to .....

by ktoś pls pomoc w tej sprawie ....

+0

dlaczego ru dając dół głos ... –

+0

Czy bierzesz za pomocą ORM np Linq do encji SQL lub EF? – James

+0

nie .. muszę użyć tego .... –

Odpowiedz

4

W twoim przypadku, jeśli uważają, że blok catch dostanie excuted jeśli istnieje nie jest dostępny żaden wiersz, ponieważ jesteś w błędzie, ponieważ Nawet jeśli nie ma danych, po wybraniu zapytania otrzyma się exucuted bez wyjątku Tworzy datatable z kolumnami, ale bez wierszy.

za to myślę, że można użyć właściwości ds.table[0].rows.count, która zwraca 0, jeśli nie ma wiersza w datatable.

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

Właściwość Rables obiektu DataTable ma wartość NULL, gdy nie ma wierszy: http://msdn.microsoft.com/en-US/library/system.data.datatable.rows.aspx – stuartd

+1

@Stuart Dunkeld - lepiej jest uruchomić kod i sprawdź to sam i, jeśli to możliwe, usuń skargę po sprawdzeniu. –

+0

Czy dokumentacja MSDN jest nieprawidłowa lub wprowadzająca w błąd? – stuartd

3

Zwraca pustą tabelę. To powszechne zachowanie. Jeśli chcesz mieć zerowy tabeli należy sprawdzić dla wiersza policzyć:

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

Wielkie dzięki ...sascha to działa teraz –

3

nie jestem pewien co pytasz tutaj ... Zakładam, że chcesz go pominąć table = ds.tables [0] linia, jeśli nie ma danych?

jeśli ów przypadku try/catch przyzwyczajenie pracować jako przyzwyczajenie wyjątek ... spróbuj coś takiego zamiast ...

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

Wielkie dzięki ........ –