0

I am currently working on my Final for my second programming class in college and have run into a problem when doing a search of by database for a specific employee name, if the user enters a user name that is not in the database, the program crashes giving errors, instead of displaying the error message I created.

Method for Searching:

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

The Error: http://puu.sh/4cPWU.png

Please keep in mind that I am using Microsoft Access for my database for this project (not sure that it matters).

How do I make this so that if the name is not found in the DB that it will show my created error message instead of the error (crashing the program) in the image linked?

4

2 回答 2

1

我认为您应该在 SQL-Where-Clause 中搜索您的员工。

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

并向您的 SQL 查询添加一个参数。

一般我会这样写我的代码:

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

只是一个例子,以改进您的解决方案。

于 2013-08-28T06:49:03.190 回答
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),它看起来就像一个魅力!

于 2013-08-28T07:37:04.810 回答