2014-11-25 6 views
0

Я нашел ответы на множество ответов, но никто, кажется, не исправил мою проблему.Проверьте, есть ли у считывателя данных строки?

Пользователь нажимает кнопку «Создать», чтобы начать добавление новой записи клиента. Хранимая процедура возвращает максимальное значение CustID, затем оно увеличивается и присваивается текстовому полю txtCustID. Пока в базе данных клиентов есть запись, это работает отлично.

Но для создания самой первой записи это явно не работает, поскольку вы ничего не можете увеличить.

Что мне нужно сделать, это посмотреть, есть ли у читателя данных что-нибудь, если нет, мне нужно установить txtCustID в «1», иначе запустить существующий код как обычно.

Вот моя последняя попытка:

protected void btnNew_Click(object sender, EventArgs e) 
{ 
    Clear(); 
    SqlCommand command = conn.CreateCommand(); 
    SqlDataReader reader; 
    try 
    { 
     command.CommandText = "GetMax"; 
     command.CommandType = CommandType.StoredProcedure; 
     conn.Open(); 
     reader = command.ExecuteReader(); 
     if (reader.HasRows) 
     { 
      while (reader.HasRows) 
      { 
       while (reader.Read()) 
       { 
        int CustMax = reader.GetInt32(0); 
        CustMax++; 
        txtCustID.Text = CustMax.ToString(); 
       } 
       reader.NextResult(); 
      } 
     } 
     else 
     { 
      txtCustID.Text = "1"; 
     } 
     reader.Dispose(); 
    } 
    catch (SqlException) 
    { 
     lblMessage.Text = "Cannot connect to database"; 
    } 
    catch (Exception ex) 
    { 
     lblMessage.Text = ex.Message; 
    } 
    finally 
    { 
     command.Dispose(); 
     conn.Dispose(); 
    } 
} 

Вот моя хранимая процедура:

USE [30004243] 
GO 
/****** Object: StoredProcedure [dbo].[GetMax] Script Date: 26/11/2014 2:29:28 AM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[GetMax] 
AS 
SELECT MAX(CustID) 
FROM Customer 

А вот ошибка, что получить установлен в моей lblMessage этикетке:. «Данные Null Этот метод или свойство не могут быть вызваны значениями Null. "

Хотя пользователь может просто видеть, что сообщение и введите «1» вручную в txtCustID (который работает отлично), для удобства использования он должен установить его в 1.

Вся помощь очень ценится, и я добавлю после запроса в предыдущем вопросе, я использую .net 4.5.

+2

Если 'читатель' имеет строки, ваш' while (reader.HasRows) 'будет бесконечным циклом. –

+1

Если вы получаете одно значение, то зачем вообще использовать 'DataReader'. Почему бы не ese 'ExecuteScalar'. –

+0

Ваш вопрос в сторону, что вы будете делать, когда есть несколько пользователей * нажав кнопку «Создать» *? – Bolu

ответ

0

После комментариев/ответов здесь и нашел в другом месте, я заменил читатель выполнить скаляр. Вот что работает.

 protected void btnNew_Click(object sender, EventArgs e) 
    { 
     Clear(); 
     SqlCommand command = conn.CreateCommand(); 
     try 
     { 
      command.CommandText = "GetMax"; 
      command.CommandType = CommandType.StoredProcedure; 
      conn.Open(); 

      object cMax = command.ExecuteScalar(); 
      if (cMax != DBNull.Value) 
      { 
       int CustMax = (int)cMax; 
       CustMax++; 
       txtCustID.Text = CustMax.ToString(); 
      } 
      else 
      { 
       txtCustID.Text = "1"; 
      } 

     } 
     catch (SqlException) 
     { 
      lblMessage.Text = "Cannot connect to database"; 
     } 
     catch (Exception ex) 
     { 
      lblMessage.Text = ex.Message; 
     } 
     finally 
     { 
      command.Dispose(); 
      conn.Dispose(); 
     } 
    } 
-2

Обычно я проверяю, не читает ли читатель.

пример:

if(reader != DNNull.value){ 


}else{ 
    txtCustID.Text = "1"; 
} 
-2

Это не правильный способ добавления новой записи. Но, ответ на ваш вопрос заключается в следующем:

if (reader.HasRows == false) 
{ 
    txtCustID.Text = "1"; 
} 

EDIT: вы можете сделать это так, что на самом деле просто:

 while (dr.Read()) 
     { 
      if (dr.HasRows) 
      { 
       //Do things, insert, update 
      } 
      else 
      { 

      } 
     } 
+0

Его код уже делает это в 'else' – TyCobb

Смежные вопросы