2015-07-02 3 views
0

У меня есть следующий код:индекс системы из исключений диапазона C#

using MySql.Data.MySqlClient; 
using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace TimeClock 
{ 
    class Company 
    { 
     DataTable rows = new DataTable(); 

     public Company() 
     { 
      MySqlConnection connection = null; 
      try 
      { 

       string connectionString = TimeClock.Properties.Settings.Default.timeclockConnectionString; 
       connection = new MySqlConnection(connectionString); 
       connection.Open(); 
       MySqlCommand command = new MySqlCommand("SELECT * FROM companies WHERE ID = @ID LIMIT 1", connection); 
       command.Parameters.AddWithValue("@ID", TimeClock.Properties.Settings.Default.CompanyID); 
       MySqlDataAdapter da = new MySqlDataAdapter(command); 
       da.Fill(rows); 

      } 
      catch (MySql.Data.MySqlClient.MySqlException ex) 
      { 
       Console.WriteLine(ex); 
      } 
      finally 
      { 
       if (connection != null) 
       { 
        connection.Close(); 
       } 
      } 
     } 

     public String getName() 
     { 
      DataRow row = rows.Rows[0]; 

      return row["company_name"].ToString(); 
     } 
    } 
} 

Я знаю, почему я получаю эту ошибку: сказать, что никакие записи не были найдены в базе данных, конечно, ряд [0] будет нет, поэтому исключение. Но как мне работать, когда нет записей для хранения в Datatable? Кстати, я довольно новичок в C#, и любой вход был бы замечательным; не стесняйтесь критиковать.

+2

Как насчет проверки 'rows.Rows.Count' больше, чем' 0' или нет? –

+0

Я думал об этом, но это означало бы делать это для каждого метода ... Я с законной точки зрения считал, что этот подход ошибочен ... – Dimitri

+0

@Dimitri Если вы обеспокоены дублированием кода, и это хорошо, что вы есть, вы могли бы создайте метод проверки количества строк. Таким образом, вы можете использовать его во всем своем коде. –

ответ

1

Перед тем, как доступ к коллекции

DataRow row = rows.Rows[0]; 

вы должны убедиться, что элемент существует:

if(rows.Count > 0) 
    DataRow row = rows.Rows[0]; 

всегда

0

Для чтения данных из SQL Я делаю это так:

 using (SqlCommand SelectCommand = new SqlCommand(strbSelect.ToString())) 
     { 
       SelectCommand.Parameters.AddWithValue("Asset", AssetNumber); 
       SelectCommand.Parameters.AddWithValue("Subnumber", Subnumber); 

       SelectCommand.Connection = new SqlConnection(GetConnectionString()); 
       SelectCommand.Connection.Open(); 
       using (SqlDataReader Reader = SelectCommand.ExecuteReader()) 
       { 
        if (Reader.HasRows) 
        { 
         while (Reader.Read()) 
         { 
          if (Reader[0] != DBNull.Value) 
          { 
           ReturnValue = Reader.GetBoolean(0); 
          } 
         } 
        } 
        else 
         return false; 
       } 
       SelectCommand.Connection.Close(); 
     } 

StrbSelect является StringBuilder.

1

Вы должны изменить функцию GetName.

public String getName() 
{ 
    if (rows.Rows != null && rows.Rows.Count > 0) 
     { 
      DataRow row = rows.Rows[0]; 
      return row["company_name"].ToString(); 
     } 
     return string.Empty; 
} 
Смежные вопросы