PDA

Просмотр полной версии : вопрос в мастерам ADO.NET


Vegas
23.12.2009, 06:15
Люди, хелп... :(



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 все данные которые должны поступать с базы данных.

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

Vegas
23.12.2009, 07:09
Vit0, не помогло :(

Vit0
23.12.2009, 07:19
Vegas, дай полный код, включая SqlConnection

Vegas
23.12.2009, 07:38
Это с даталеера метод
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;
}
}

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

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



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



И лучше используй не readit[индекс].ToString(), а названия колонок. К примеру, readit["productID"].ToString(), readit["productName"].ToString() и.т.п.
Я уже чего только не перепробовал...

Vit0
23.12.2009, 08:23
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();

Vegas
23.12.2009, 08:44
:37::25:

С П А С И Б О Б О Л Ь Ш О Е ! ! ! =)