2013-08-28 4 views
0

В настоящее время я работаю над своим финалом для своего второго класса программирования в колледже и столкнулся с проблемой при выполнении поиска по базе данных для конкретного имени сотрудника, если пользователь вводит имя пользователя, которого нет в базе данных, ошибки программы, выдающие ошибки, вместо отображения сообщения об ошибке, которое я создал.Сообщение об ошибке базы данных C#?

способ поиска:

public void searchNameDbMethod() 
    { 
     OleDbConnection Myconnection = null; 
     OleDbDataReader dbReader = null; 
     string selectionText = ""; 
     bool errorFlag = true; 

     do 
     { 
      string searchName = ""; 
      Console.Write("Search for Employee Name: "); 
      searchName = Console.ReadLine(); 
      searchName = searchName.ToUpper(); 
      Console.WriteLine("\n"); 

      Myconnection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source= payrolldb.accdb"); 

      Myconnection.Open(); 
      selectionText = "SELECT * FROM Table1;"; 
      OleDbCommand cmd = Myconnection.CreateCommand(); 
      cmd.CommandText = selectionText; 
      dbReader = cmd.ExecuteReader(); 

      if (dbReader.HasRows) 
      { 
       while (dbReader.Read()) 
       { 
        // since the query produces one column, the GetValue(0)   
        //must be set     
        // with multiple column queries, you have to know which 
        //column holds 
        // the value that you are looking for      
        //field 0 = ID 
        dbName = dbReader.GetValue(1).ToString();   //1 is field 1 of the db 
        if (dbName == searchName) 
        { 
         dbName = dbReader.GetValue(1).ToString();   //1 is field 1 of the db 
         dbID = dbReader.GetValue(2).ToString(); //2 is field 2 of the db 
         dbHourlyWage = dbReader.GetValue(3).ToString(); 
         dbDependents = dbReader.GetValue(4).ToString(); 

         Console.Clear(); 
         Console.ResetColor(); 
         Console.ForegroundColor = ConsoleColor.Green; 
         Console.WriteLine("*******************************************************"); 
         Console.WriteLine("**************** {0} *****************", date); 
         Console.WriteLine("*******************************************************"); 
         Console.WriteLine("Employee Name: ", dbName); 
         Console.WriteLine("Employee ID: {0}", dbID); 
         Console.WriteLine("Hourly Wage: {0}", dbHourlyWage); 
         Console.WriteLine("Number of Dependents: {0}", dbDependents); 
         Console.WriteLine("*******************************************************"); 
         Console.ResetColor(); 
         Console.Write("\n\n"); 

         errorFlag = false; 
        }//closes if    
       }// end of while 
      }// end of if 
      if (errorFlag == true) 
      { 
       Console.ResetColor(); 
       Console.ForegroundColor = ConsoleColor.Red; 
       Console.WriteLine("Name is not in our database!");//shows the data accumulated from above  
       Console.ResetColor(); 
      }//closes if 
      dbReader.Close(); 
      Myconnection.Close(); 
     }//close do 
     while (errorFlag == true); 
    }//closes searchNameDbMethod 

Ошибка:http://puu.sh/4cPWU.png

Пожалуйста, имейте в виду, что я использую Microsoft Access для моей базы данных для данного проекта (не уверен, что это имеет значение) ,

Как это сделать, чтобы, если имя не найдено в БД, чтобы оно отображало мое созданное сообщение об ошибке вместо ошибки (сбой программы) в связанном изображении?

+1

См. Эту ссылку http://social.msdn.microsoft.com/Forums/en-US/1d5c04c7-157f-4955-a14b-41d912d50a64/how-to-fix-error-the-microsoftaceoledb120-provider- is-not-registered-on-the-local-machine –

+0

Какую версию доступа вы установили? – Gonzix

+0

@Gonzix Access 2010 – Meta

ответ

1

Я думаю, вам следует искать своего сотрудника в SQL-Where-Clause.

selectionText = "SELECT * FROM Table1 WHERE <EmployeeName> like @Name;"; 

И добавьте параметр в SQL-Query.

General я хотел бы написать свой код так:

void searchNameDbMethod() 
{ 
    OleDbConnection Myconnection = null; 
    OleDbDataReader dbReader = null; 
    string selectionText = ""; 


    string searchName = ""; 
    Console.Write("Search for Employee Name: "); 
    searchName = Console.ReadLine(); 
    searchName = searchName.ToUpper(); 
    Console.WriteLine("\n"); 

    Myconnection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source= payrolldb.accdb"); 

    Myconnection.Open(); 
    selectionText = "SELECT * FROM Table1 WHERE Employee like @Name;"; 
    OleDbCommand cmd = Myconnection.CreateCommand(); 
    cmd.CommandText = selectionText; 

    cmd.Parameters.Add(new OleDbParameter() { ParameterName = "@Name", Value = searchName, DbType = System.Data.DbType.String }); 

    try 
    { 
     dbReader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

     while (dbReader.Read()) 
     { 
      // since the query produces one column, the GetValue(0)   
      //must be set     
      // with multiple column queries, you have to know which 
      //column holds 
      // the value that you are looking for      
      //field 0 = ID 
      string dbName = dbReader.GetValue(1).ToString();   //1 is field 1 of the db 
      if (dbName == searchName) 
      { 
       dbName = dbReader.GetValue(1).ToString();   //1 is field 1 of the db 
       string dbID = dbReader.GetValue(2).ToString(); //2 is field 2 of the db 
       string dbHourlyWage = dbReader.GetValue(3).ToString(); 
       string dbDependents = dbReader.GetValue(4).ToString(); 

       Console.Clear(); 
       Console.ResetColor(); 
       Console.ForegroundColor = ConsoleColor.Green; 
       Console.WriteLine("*******************************************************"); 
       Console.WriteLine("**************** {0} *****************", date); 
       Console.WriteLine("*******************************************************"); 
       Console.WriteLine("Employee Name: ", dbName); 
       Console.WriteLine("Employee ID: {0}", dbID); 
       Console.WriteLine("Hourly Wage: {0}", dbHourlyWage); 
       Console.WriteLine("Number of Dependents: {0}", dbDependents); 
       Console.WriteLine("*******************************************************"); 
       Console.ResetColor(); 
       Console.Write("\n\n"); 
      } 
     } 
    } 
    catch 
    { 
     if (dbReader != null) 
     { 
      dbReader.Close(); 
     } 
    } 
    finally 
    { 
     if (Myconnection != null) 
     { 
      Myconnection.Close(); 
     } 
    } 
} 

только пример, чтобы улучшить свое решение.

+0

В этом случае, где бы я разместил свое сообщение об ошибке «Имя нет в нашей базе данных!» ? Кроме того, новая строка параметров имени должна быть выше строки запроса (это имя имени объявляется до его использования). – Meta

+0

О, я сделал ошибку, вам не нужно ** if (dbName == searchName) ** anmyore. Но вы можете сделать счетчик в своем цикле и подсчитать сотрудников, которые были найдены. – BendEg

+0

С кодом, который вы опубликовали, я получаю следующую ошибку: http://puu.sh/4cR3b.png никогда не использовал этот материал раньше, поэтому я не знаю, что делать, чтобы исправить это? Также как вы предлагаете делать счетчик для чего-то подобного? * im все еще довольно новичок в программировании, и я не на 100% знаком с множеством вещей * – Meta

0

я был в состоянии понять это НАШ на основе некоторых из кода, представленного @BendEg

Вот что я сделал:

public void searchNameDbMethod() 
    { 
     OleDbConnection Myconnection = null; 
     OleDbDataReader dbReader = null; 
     string selectionText = ""; 
     bool errorFlag = true; 

     do 
     { 
      string searchName = ""; 
      Console.Write("Search for Employee Name: "); 
      searchName = Console.ReadLine(); 
      searchName = searchName.ToUpper(); 
      Console.WriteLine("\n"); 

      Myconnection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source= payrolldb.accdb"); 

      Myconnection.Open(); 
      selectionText = "SELECT * FROM Table1 WHERE employee_name='" + searchName + "'"; 
      OleDbCommand cmd = Myconnection.CreateCommand(); 
      cmd.CommandText = selectionText; 
      dbReader = cmd.ExecuteReader(); 

      if (dbReader.HasRows) 
      { 
       while (dbReader.Read()) 
       { 
        // since the query produces one column, the GetValue(0)   
        //must be set     
        // with multiple column queries, you have to know which 
        //column holds 
        // the value that you are looking for      
        //field 0 = ID 
        dbName = dbReader.GetValue(1).ToString();   //1 is field 1 of the db 
        if (dbName == searchName) 
        { 
         dbName = dbReader.GetValue(1).ToString();   //1 is field 1 of the db 
         dbID = dbReader.GetValue(2).ToString(); //2 is field 2 of the db 
         dbHourlyWage = dbReader.GetValue(3).ToString(); 
         dbDependents = dbReader.GetValue(4).ToString(); 

         Console.Clear(); 
         Console.ResetColor(); 
         Console.ForegroundColor = ConsoleColor.Green; 
         Console.WriteLine("*******************************************************"); 
         Console.WriteLine("**************** {0} *****************", date); 
         Console.WriteLine("*******************************************************"); 
         Console.WriteLine("Employee Name: ", dbName); 
         Console.WriteLine("Employee ID: {0}", dbID); 
         Console.WriteLine("Hourly Wage: {0}", dbHourlyWage); 
         Console.WriteLine("Number of Dependents: {0}", dbDependents); 
         Console.WriteLine("*******************************************************"); 
         Console.ResetColor(); 
         Console.Write("\n\n"); 

         errorFlag = false; 
        }//closes if    
       }// end of while 
      }// end of if 
      else if (!dbReader.HasRows) 
      { 
       Console.ResetColor(); 
       Console.ForegroundColor = ConsoleColor.Red; 
       Console.WriteLine("Name is not in our database!");//shows the data accumulated from above  
       Console.ResetColor(); 
      }//closes if 
      dbReader.Close(); 
      Myconnection.Close(); 
     }//close do 
     while (errorFlag == true); 
    }//closes searchNameDbMethod 

Как вы можете видеть, что я изменил мой запрос, как он (но без лишних сложностей), и изменил мой if (errorFlag == true) оператор на else if (! dbReader.HasRows) и, похоже, работает как шарм!

Смежные вопросы