当前正在为我正在工作的公司开发一个小型工具,该工具将处理数据库。我有几个处理各种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函数和对象数组,可以很好地加载代码,但是一旦到达这一部分,我就会在
上得到Exceptionur["au_ApplicationId"].ToString(),
它只是说
System.IndexOutOfRangeException:'au_ApplicationId'
答案 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, ...