Получение IndexOutOfRangeException при помещении sql в массив объектов - PullRequest
0 голосов
/ 21 февраля 2019

В настоящее время работаю над небольшим инструментом для компании, над которой я работаю, которая будет обрабатывать базу данных.У меня есть несколько классов, обрабатывающих различные функции SQL, но всякий раз, когда я пытаюсь поместить определенные данные из базы данных в представление данных, я получаю исключение.

Функция SQL:

public class OUsersDB
{
    SqlConnection conn = new SqlConnection("Connection Information");

    public SqlDataReader Select()
    {
        conn.Open();
        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "SELECT au.ApplicationId, au.UserId, au.UserName, au.MobileAlias, au.LastActivityDate, au.Name, sms.number, am.email FROM aspnet_users AS au " +
            " JOIN aspnet_membership AS am ON au.userid=am.userid " +
            " JOIN smsphonebooks AS sms ON au.name=sms.name";
        SqlDataReader ur = cmd.ExecuteReader();
        return ur;

    }
}

Функция сетки данных Winform

        public void Usersdb()
    {
        OUsersDB oudb = new OUsersDB();
        SqlDataReader ur = oudb.Select();
        myDataUsers.Rows.Clear();
        while (ur.Read())
        {
            object[] objUsers = {
                ur["au_ApplicationId"].ToString(),
                ur["au_UserId"].ToString(),
                ur["au_UserName"].ToString(),
                ur["au_MobileAlias"].ToString(),
                ur["au_LastActivityDate"].ToString(),
                ur["au_Name"].ToString(),
                ur["au_Phone"].ToString(),
                ur["au_Email"].ToString(), };
            myDataUsers.Rows.Add(objUsers);
            conn.Close();
        }

У меня есть аналогичная функция sql и массив объектов в коде, который загружается просто отлично, но, достигнув этой части, я получаю исключение на

ur["au_ApplicationId"].ToString(),

Это просто говорит

System.IndexOutOfRangeException: 'au_ApplicationId'

Ответы [ 4 ]

0 голосов
/ 21 февраля 2019

Вы можете попробовать это:

https://stackoverflow.com/a/8656011/8512753

или удалить псевдонимы таблицы

ur["au_ApplicationId"].ToString(),

становится

ur["ApplicationId"].ToString(),

и попытаться назначитьконкретные значения столбцов, возвращаемых в вашем SQL

SELECT ApplicationId = au.ApplicationId, ...
0 голосов
/ 21 февраля 2019

Проверьте, есть ли у вас ЛЮБОЙ объект, может быть, вы вообще ничего не получите.

0 голосов
/ 21 февраля 2019

Что касается IndexOutOfRangeException, это связано с попыткой получить доступ к столбцу, который не существует в читателе.Не уверен, почему вы ставите перед столбцами префикс «au_», когда оператор SELECT этого не делает.

Я бы вместо этого использовал SqlDataAdapter и добавил бы добавление этого метода в OUsersDB.

public void FillTable(DataTable table)
{
    SqlCommand cmd = conn.CreateCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "SELECT au.ApplicationId, au.UserId, au.UserName, au.MobileAlias, au.LastActivityDate, au.Name, sms.number, am.email FROM aspnet_users AS au " +
        " JOIN aspnet_membership AS am ON au.userid=am.userid " +
        " JOIN smsphonebooks AS sms ON au.name=sms.name";
    using(var adapter = new SqlDataAdapter(cmd))
        adapter.Fill(table)
}

Измените код вызова на:

public void Usersdb()
{
    OUsersDB oudb = new OUsersDB();
    myDataUsers.Rows.Clear();
    oudb.FillTable(myDataUsers);
}

Или вот вместо этого простое исправление.Измените ваш оператор SELECT на псевдонимы столбцов, как ожидается в коде.

SELECT au.ApplicationId as au_ApplicationId, au.UserId as au_UserId, au.UserName as au_UserName, 
au.MobileAlias as au_MobileAlias, au.LastActivityDate as au_LastActivity, au.Name as au_Name, 
sms.number as au_Phone, am.email as au_Email -- REST OF QUERY UNCHANGED
0 голосов
/ 21 февраля 2019

Измените объект для чтения столбцов без псевдонима.Вы используете псевдонимы только для ссылки на столбцы в запросе, но выходные данные запроса не будут иметь псевдонимов.

while (ur.Read())
        {
            object[] objUsers = {
                ur["ApplicationId"].ToString(),
                ur["UserId"].ToString(),
                ur["UserName"].ToString(),
                ur["MobileAlias"].ToString(),
                ur["LastActivityDate"].ToString(),
                ur["Name"].ToString(),
                ur["Phone"].ToString(),
                ur["Email"].ToString(), };
            myDataUsers.Rows.Add(objUsers);
            conn.Close();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...