在使用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。
请指导我如何解决此问题。
答案 0 :(得分:9)
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;
}
答案 1 :(得分:1)
在经历了这个错误的麻烦后,我发现了一些隐藏的内容:
我将连接对象声明为公共变量。然后我通过几个函数使用它,有一次我决定不重置它的连接字符串,因为它已经由前面的过程设置。
后续函数在通过公共连接对象设置的表循环时调用前一个函数,因此在前一个函数返回其值后丢失了它的连接,并且CLOSED ITS CONNECTION OBJECT(这是一个共享的公共对象)这两个功能)!
我希望这是有道理的......我花了几个小时才能弄清楚发生了什么。