3

在使用 C# 在 ASP.NET 中执行以下代码时,我收到一个异常,例如“行/列不存在数据”。

OdbcConnection DbConnection = new   OdbcConnection(ConfigurationManager.AppSettings["ConnectionStr"]);        
DbConnection.Close();        
string cmdText = "SELECT Team_ID FROM team_details WHERE Team_Code=?";        
OdbcCommand cmd = new OdbcCommand(cmdText, DbConnection);
cmd.Parameters.Add("?Code", OdbcType.VarChar).Value = tbCode.Text;
DbConnection.Open();
OdbcDataReader DR = cmd.ExecuteReader();
DR.Read();        
if (DR.GetValue(0) != DBNull.Value)        
{
    args.IsValid = false;
}
else
{
    args.IsValid = true;
}
DbConnection.Close();

我正在使用 Visual Studio 2008 和 MySQL。我正在使用 MySql ODBC 连接器 5.1 和 MDAC2.8。

请指导我如何解决这个问题。

4

2 回答 2

10

Read 方法返回一个布尔值,指示是否返回了任何行,因此您应该始终在访问读取器的结果之前测试此值。

  OdbcDataReader DR = cmd.ExecuteReader();



if (DR.Read() && DR.GetValue(0) != DBNull.Value)    
 {   
    args.IsValid = false; 
 } 
 else 
 {   
     args.IsValid = true; 
 } 
 DbConnection.Close();

编辑----您还应该考虑using连接,因为这将确保即使在 using 语句中发生异常也已关闭(处置)。

你也可以去掉这个if声明,但这是一个品味问题。

最后,标准的 .NET 习惯用法是将连接字符串保留在 web.config 的 ConnectionStrings 部分中。这在下面没有显示。

   using(OdbcConnection DbConnection = new  OdbcConnection(ConfigurationManager.AppSettings["ConnectionStr"]))
   {
          string cmdText = "SELECT Team_ID FROM team_details WHERE Team_Code=?";        
          OdbcCommand cmd = new OdbcCommand(cmdText, DbConnection);
          cmd.Parameters.Add("?Code", OdbcType.VarChar).Value = tbCode.Text;
          DbConnection.Open();
          OdbcDataReader DR = cmd.ExecuteReader();
          args.IsValid = DR.Read() && DR.GetValue(0) != DBNull.Value;
   }
于 2011-06-25T08:33:32.100 回答
3

在为这个错误经历了这么多麻烦之后,我发现了一些隐藏的东西:

我将连接对象声明为公共变量。然后我通过几个函数使用它,并且有一次我决定不重置它的连接字符串,因为它已经由前面的过程设置。

随后的函数,在循环通过公共连接对象设置的表时调用前一个函数,因此在前一个函数返回其值后失去其连接,并关闭了它的连接对象(这是两个函数共享的公共对象)!

我希望这是有道理的……我花了几个小时才弄清楚发生了什么。

于 2016-07-02T17:56:55.510 回答