将sql放入对象数组时获取IndexOutOfRangeException

时间:2019-02-21 14:12:17

标签: c# sql winforms datagridview

当前正在为我正在工作的公司开发一个小型工具,该工具将处理数据库。我有几个处理各种SQL函数的类,但是每当我尝试将数据库中的特定数据放入datagridview时,都会出现异常。

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函数和对象数组,可以很好地加载代码,但是一旦到达这一部分,我就会在

上得到Exception
ur["au_ApplicationId"].ToString(),

它只是说

  

System.IndexOutOfRangeException:'au_ApplicationId'

4 个答案:

答案 0 :(得分:0)

更改obj以读取没有别名的列。您仅使用别名来引用查询中的列,但查询的输出将没有别名。

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();
        }

答案 1 :(得分:0)

检查是否有任何对象,也许什么也没得到。

答案 2 :(得分:0)

关于IndexOutOfRangeException,是由于尝试访问阅读器中不存在的列。不确定SELECT语句未执行此操作时为什么要在列前面加上“ au _”。

我将改用Services - Kubernetes并将此方法添加到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

答案 3 :(得分:0)

您可以尝试以下方法:

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

或删除表别名

ur["au_ApplicationId"].ToString(),

成为

ur["ApplicationId"].ToString(),

并尝试为SQL中返回的列分配具体值

SELECT ApplicationId = au.ApplicationId, ...