Поиск:

Вернуться   Форум > Технический раздел > Programming

Ответ
 
Опции темы
Старый 23.12.2009, 06:15 Вверх     #1
Vegas
Близкий Знакомый
 
Аватар для Vegas
 
   Возраст: 42
Регистрация: 27.01.2006
Был(а) у нас: 11.01.2016 12:20
Сообщений: 225

Пол: Мужской
По умолчанию вопрос в мастерам ADO.NET

Люди, хелп...

Код:
try
            {
                conn.Open();
                SqlDataReader readit = cmd.ExecuteReader();
                if (readit.HasRows)
                {
                    theUser = new User((Int64)readit[0], readit[1].ToString(), readit[2].ToString(),
                        readit[3].ToString(), readit[4].ToString(), (Int32)readit[5]);
                }
                readit.Close();
            }
            catch (System.Exception ex)
            {
                JobInfoIl.Tools.SetErrorMessagesForUser(ex.Message);
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }
Выдает ошибку:

Недопустимая попытка чтения при отсутствии данных.

Но при дебаге я вижу что в readit все данные которые должны поступать с базы данных.
Vegas вне форума   Ответить с цитированием
Старый 23.12.2009, 06:53 Вверх     #2
Vit0
Красавчик форума
 
Аватар для Vit0
 
   Возраст: 41
Регистрация: 23.09.2003
Был(а) у нас: 01.11.2011 07:05
Сообщений: 22,253

Пол: Мужской
По умолчанию

Vegas, перенеси readit.Close(); в конец, после conn.Close();
И лучше используй не readit[индекс].ToString(), а названия колонок. К примеру, readit["productID"].ToString(), readit["productName"].ToString() и.т.п.

Кто ищет, тот найдёт. Кто не ищет, того найдут.. (с)
Vit0 вне форума   Ответить с цитированием
Старый 23.12.2009, 07:09 Вверх     #3
Vegas
Близкий Знакомый
 
Аватар для Vegas
 
   Возраст: 42
Регистрация: 27.01.2006
Был(а) у нас: 11.01.2016 12:20
Сообщений: 225

Пол: Мужской
По умолчанию

Vit0, не помогло
Vegas вне форума   Ответить с цитированием
Старый 23.12.2009, 07:19 Вверх     #4
Vit0
Красавчик форума
 
Аватар для Vit0
 
   Возраст: 41
Регистрация: 23.09.2003
Был(а) у нас: 01.11.2011 07:05
Сообщений: 22,253

Пол: Мужской
По умолчанию

Vegas, дай полный код, включая SqlConnection

Кто ищет, тот найдёт. Кто не ищет, того найдут.. (с)
Vit0 вне форума   Ответить с цитированием
Старый 23.12.2009, 07:38 Вверх     #5
Vegas
Близкий Знакомый
 
Аватар для Vegas
 
   Возраст: 42
Регистрация: 27.01.2006
Был(а) у нас: 11.01.2016 12:20
Сообщений: 225

Пол: Мужской
По умолчанию

Это с даталеера метод
Код:
public static JobInfoIl.User UserLogin(string UserNick, string UserPassword)
        {
            JobInfoIl.User theUser = null;
            JobInfoIl.Tools.SetErrorMessagesForUser(string.Empty);
            //theUser.DataBaseError = string.Empty;
            cmd.Parameters.Clear();
            cmd.CommandText = "UserLogin";
            SqlParameter pUserName = new SqlParameter("@UserNick", UserNick);
            cmd.Parameters.Add(pUserName);
            SqlParameter pUserPassword = new SqlParameter("@UserPassword", UserPassword);
            cmd.Parameters.Add(pUserPassword);
            try
            {
                conn.Open();
                SqlDataReader readit = cmd.ExecuteReader();
                if (readit.HasRows)
                {
                    theUser = new User((Int64)readit[0], readit[1].ToString(), readit[2].ToString(),
                        readit[3].ToString(), readit[4].ToString(), (Int32)readit[5]);
                }
                readit.Close();
            }
            catch (System.Exception ex)
            {
                JobInfoIl.Tools.SetErrorMessagesForUser(ex.Message);
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }
            return theUser;
        }
ConnectionString работает 100% т.к. данные в readit поступают. Это видно при дебаге
(не могу сделать скрин с подсказаками VS2008)

предедущий метод брал только ID пользователя
Result = Convert.ToInt32(cmd.ExecuteScalar());

Это работает.

Теперь надо загнать несколько полей в класс.
Код:
public class User
    {


        

        //protected string database_error = string.Empty;
        //public string DataBaseError
        //{
        //    set
        //    {
        //        database_error = value;
        //    }
        //    get
        //    {
        //        return database_error;
        //    }
        //}

        private Int64 userId = 0;
        private string userNick = "";
        private string userFirstName = "";
        private string userLastName = "";
        private string userEmail = "";
        private int userAdminStatus = 0;

//тут еще свойства, я их убрал чтоб не расстягивать пост.

        public User(Int64 User_Id, string User_Nick, string User_FirstName, string User_LastName, string User_Email, int User_AdminStatus)
	    {
            this.userId = User_Id;
            this.userNick = User_Nick;
            this.userFirstName = User_FirstName;
            this.userLastName = User_LastName;
            this.userEmail = User_Email;
            this.userAdminStatus = User_AdminStatus;
	    }
    }

Последний раз редактировалось Vegas; 23.12.2009 в 07:41.. Причина: отменить смайлы
Vegas вне форума   Ответить с цитированием
Старый 23.12.2009, 08:07 Вверх     #6
Vit0
Красавчик форума
 
Аватар для Vit0
 
   Возраст: 41
Регистрация: 23.09.2003
Был(а) у нас: 01.11.2011 07:05
Сообщений: 22,253

Пол: Мужской
По умолчанию

Vegas, так на каком этапе дебаг ругается, и что за ошибку выдаёт?

Кто ищет, тот найдёт. Кто не ищет, того найдут.. (с)
Vit0 вне форума   Ответить с цитированием
Старый 23.12.2009, 08:15 Вверх     #7
Vegas
Близкий Знакомый
 
Аватар для Vegas
 
   Возраст: 42
Регистрация: 27.01.2006
Был(а) у нас: 11.01.2016 12:20
Сообщений: 225

Пол: Мужской
По умолчанию

отсюда переходит к catch
Код:
theUser = new User((Int64)readit[0], readit[1].ToString(), readit[2].ToString(),
                        readit[3].ToString(), readit[4].ToString(), (Int32)readit[5]);

Ошибка:
Недопустимая попытка чтения при отсутствии данных.



Цитата:
Сообщение от Vit0 Посмотреть сообщение
И лучше используй не readit[индекс].ToString(), а названия колонок. К примеру, readit["productID"].ToString(), readit["productName"].ToString() и.т.п.
Я уже чего только не перепробовал...
Vegas вне форума   Ответить с цитированием
Старый 23.12.2009, 08:23 Вверх     #8
Vit0
Красавчик форума
 
Аватар для Vit0
 
   Возраст: 41
Регистрация: 23.09.2003
Был(а) у нас: 01.11.2011 07:05
Сообщений: 22,253

Пол: Мужской
По умолчанию

Vegas, пропиши так:


Код:
 conn.Open();
                SqlDataReader readit = cmd.ExecuteReader();
                readit.Read();
                if (readit.HasRows)
                {
                    theUser = new User((Int64)readit[0], readit[1].ToString(), readit[2].ToString(), readit[3].ToString(), readit[4].ToString(), (Int32)readit[5]);
                }
                readit.Close();

Кто ищет, тот найдёт. Кто не ищет, того найдут.. (с)
Vit0 вне форума   Ответить с цитированием
Эти пользователи сказали Спасибо Vit0: Vegas
Старый 23.12.2009, 08:44 Вверх     #9
Vegas
Близкий Знакомый
 
Аватар для Vegas
 
   Возраст: 42
Регистрация: 27.01.2006
Был(а) у нас: 11.01.2016 12:20
Сообщений: 225

Пол: Мужской
По умолчанию



С П А С И Б О Б О Л Ь Ш О Е ! ! ! =)
Vegas вне форума   Ответить с цитированием
Ответ


Метки
open


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT, время: 09:24.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Follow FriendsForumCom on Twitter liveinternet.ru Рейтинг@Mail.ru