Нет данных для строки / столбца - PullRequest
2 голосов
/ 25 июня 2011

При выполнении следующего кода в ASP.NET с C # я получаю исключение типа «Нет данных для строки / столбца».

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.

Пожалуйста, сообщите мне, как решить эту проблему.

Ответы [ 2 ]

9 голосов
/ 25 июня 2011

Метод 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 будет сохранение строки подключения в разделе ConnectionStrings файла web.config. Это не показано ниже.

   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 голос
/ 02 июля 2016

Пройдя через столько проблем с этой ошибкой, я обнаружил в ней что-то скрытое:

Я объявил объект соединения как публичную переменную. Затем я использую его в нескольких функциях, и в какой-то момент я решил не сбрасывать строку подключения, поскольку она уже была установлена ​​предыдущей процедурой.

Последующая функция, которая вызывала предыдущую функцию, находясь в цикле по таблице, установленной публичным объектом соединения, таким образом потеряла свое соединение после того, как предыдущая функция вернула свои значения, и ЗАКРЫТЫЙ ОБЪЕКТ СОЕДИНЕНИЯ ЕГО (который является публичным объектом, совместно используемым две функции)!

Надеюсь, это имело смысл ... Мне понадобились часы, чтобы понять, что происходит.

...