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