C# 数据读取器故障

C# 数据读取器故障,c#,exception,datareader,oledbdatareader,C#,Exception,Datareader,Oledbdatareader,下午,我正在写一个数据库管理程序,使工作更轻松。如果表没有返回任何结果,我就无法使用datareader。我在网上到处寻找解决方案,但没有结果。所以,我吃着谦虚的馅饼,问道 首先,为了让您了解数据库布局,我们有多个表,我想在一个列表视图中显示结果。该代码可以很好地显示整个表,但当尝试搜索时,在第一个表中找不到结果,则会对循环中的每个表抛出异常。但是,如果在第一个表中找到结果,它将继续再次循环,直到在每个表中都找不到搜索字符串 这是密码 private string _strDBPath; pri

下午,我正在写一个数据库管理程序,使工作更轻松。如果表没有返回任何结果,我就无法使用datareader。我在网上到处寻找解决方案,但没有结果。所以,我吃着谦虚的馅饼,问道

首先,为了让您了解数据库布局,我们有多个表,我想在一个列表视图中显示结果。该代码可以很好地显示整个表,但当尝试搜索时,在第一个表中找不到结果,则会对循环中的每个表抛出异常。但是,如果在第一个表中找到结果,它将继续再次循环,直到在每个表中都找不到搜索字符串

这是密码

private string _strDBPath;
private string _strContractNumber;
public string[] dbTables = new string[9] {"0", "1800", "2800", "4000", "5000", "5400", "5700", "6800", "7800"};
public string[] dbFields = new string[3] { "ContractNumber", "Name", "REF",};
private enum sqlType {Normal, Search}
private bool dbSearch =false;



private void frmRecords_Load(object sender, EventArgs e)
{
        lstContractsAddColums();
        timerStart.Start();
    }

    private void lstContractsAddColums()
    {
        lstContracts.Columns.Clear();

        for (int i = 0; i < dbFields.Length; i++) //Check to see if last field in array
            lstContracts.Columns.Add(dbFields[i], 200, HorizontalAlignment.Left);
    }

    private void timerStart_Tick(object sender, EventArgs e)
    {
        for (int i = 0; i < dbTables.Length; i++)
        {
            while (!dbSearch == false)
            {

            }
            dbGetData(i, sqlType.Search, "1000", "ContractNumber");
            dbSearch = false;
        }

        timerStart.Stop();
    }

    private void dbGetData(int dbTable, sqlType sqlRecords, string strSearch, string strField)
    {


        string mySQL = "SELECT ";

        for (int i = 0; i < dbFields.Length; i++) //Check to see if last field in array
            if (i < dbFields.Length - 1)
            {
                mySQL = mySQL + dbFields[i] + ", "; //This is not the last field
            }
            else
            {
                mySQL = mySQL + dbFields[i] + " "; //This is the last field (No commor required)
            }

        switch (sqlRecords)
        {
            case sqlType.Normal:
                mySQL = mySQL + " From " + dbTables[dbTable] + " ORDER BY ContractNumber"; //Adds the last part of the sayntex           
            break;

            case sqlType.Search:
                mySQL = mySQL + " From " + dbTables[dbTable] + " WHERE " + strField + " = " + strSearch; //Adds the last part of the sayntex
                break;
            default:
                mySQL = mySQL + " From " + dbTables[dbTable] + " ORDER BY ContractNumber"; //Adds the last part of the sayntex 
                break;
        }

        ConnStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strDBPath + ";Jet OLEDB:Database Password="; //Selects the database along with the provider of the database

        try 
        {

            using(OleDbConnection MyConn = new OleDbConnection(ConnStr) )
            {
                MyConn.Open(); //opens MyConn 
                OleDbCommand Cmd = new OleDbCommand(mySQL, MyConn);
                OleDbDataReader ObjReader = Cmd.ExecuteReader();

                if (!ObjReader.HasRows)
                {
                    MessageBox.Show("No rows found"); 
                }
                else
                {
                    while (ObjReader.Read())
                    {
                        ListViewItem item = new ListViewItem(ObjReader[dbFields[0].ToString()].ToString());
                        for (int i = 1; i < dbFields.Length; i++) //Check to see if last field in array
                            item.SubItems.Add(ObjReader[dbFields[i]].ToString());
                        lstContracts.Items.Add(item);
                    }  
                }
                dbSearch = true;
                ObjReader.Close();
                Cmd.Dispose();
                MyConn.Close();
            } 
        }
        catch (Exception ex)
        {
            oErrorLog.WriteErrorLog(ex.ToString());
            dbSearch = true;
        }
        finally
        {
            dbSearch = true;
        }
    }
private string\u strDBPath;
专用字符串\u strContractNumber;
公共字符串[]dbTables=新字符串[9]{“0”、“1800”、“2800”、“4000”、“5000”、“5400”、“5700”、“6800”、“7800”};
公共字符串[]dbFields=新字符串[3]{“ContractNumber”、“Name”、“REF”、};
私有枚举sqlType{Normal,Search}
private bool dbSearch=false;
私有void frmRecords_加载(对象发送方,事件参数e)
{
lstcolums();
timerStart.Start();
}
私有无效列()
{
lstContracts.Columns.Clear();
for(int i=0;i

这可能有点傻,但任何建议都会有所帮助。

您的
dbSearch
变量和循环极其错误。在调试错误显示的位置时,您会遇到什么异常。代码在OleDbDataReader ObjReader=Cmd.ExecuteReader()上出错;显示的错误为System.Data.OleDb.OLEDBEException(0x80040E07):条件表达式中的数据类型不匹配。在System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)在System.Data.OleDb.OleDbCommand.ExecuteCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams,Object&ExecuteSult)在System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object&ExecuteSult)在System.Data.OleDb.OleDbCommand.ExecuteInternal(CommandBehavior,String方法)dbSearch循环只是为了确保在移动到下一个表之前已经执行了dbGetdata。