繁体   English   中英

Index was outside on the bounds of array error on c# log in with SQL

[英]Index was outside on the bounds of array error on c# log in with SQL

您好,我有一个连接到服务器字符串的登录名,并在按下登录按钮时执行此登录。 如果用户和密码未存储在数据库中,它会返回无效错误,但如果它们在数据库中,则会抛出“索引在数组边界之外”错误。 我将如何解决这个问题? 谢谢

我的连接字符串位于我的 appconfig 文件中,问题可能出在那里吗?

##########点击登录按钮后填写 WINDOWS
 private void btnOK_Click(object sender, EventArgs e) { SqlConnection con = Program.GetConnection; SqlDataReader dr = null; try { SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE UserName='" + txtName.Text + "'AND Password='" + textpassword.Text + "'", con); dr = cmd.ExecuteReader(); if (dr.Read()) { Program.UserLoginName = dr.GetString(3); this.Close(); } else MessageBox.Show("Invalid Username & Password;"). } catch (Exception ex) { MessageBox.Show(ex;Message); } }
#######程序.CS 文件
Using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Data.SqlClient; using System.Configuration; namespace FrontEndV1 { static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Login()); } public static SqlConnection GetConnection { get { string ConnectionString = ConfigurationManager.ConnectionStrings["FrontEndV1Connection"].ConnectionString; SqlConnection con = new SqlConnection(ConnectionString); con.Open(); return con; } } public static string UserLoginName { get; set; } }

}

这是你的问题:

Program.UserLoginName = dr.GetString(3);

您得到的字段索引大于返回的字段数。
您必须使用介于0和dr.FieldCount-1之间的索引。

或者,您可以使用dr.GetString(dr.GetOrdinal(desired_field_name)) :这样更好(即使需要更多指令),因为您可以交换dr.GetString(dr.GetOrdinal(desired_field_name))订单(也许您需要更改查询)而不会失去功能。

我认为错误在于: dr.GetString(3); 尝试将3更改为2。在数组中,计数从0开始。

您没有说错误在哪里抛出,但是我怀疑这行:

Program.UserLoginName = dr.GetString(3);

如果查询返回少于4列,将引发错误。

另外,这很容易受到Sql注入的影响。 使用存储的proc或参数化查询。

我在使用 SQL Server Express 2014 和来自 3 个不同表的登录存储过程时遇到了相同的错误,我真的很困惑发生了什么,但最终发现我有更多的列从一个表中选择,然后是其他两个

有时它背后的逻辑

我认为您只有三栏。 第三列的索引是2,因此请更改此行

Program.UserLoginName = dr.GetString(3);

Program.UserLoginName = dr.GetString(2);

您不能调试应用程序吗? 如果可以,请尝试从引发异常的位置进行查找。 正如Marco和其他用户所建议的那样,如果您在执行dr.GetString(3)dr.GetString(3)异常,则问题就出在那儿。 尝试使用正确的列序号,或使用SELECT Column1, Column2, ..., ColumnN FROM Table以便准确知道要指定的序号。

编码错误:

  1. 使用select * ,您应该使用列名
  2. 使用索引检索行中的值,您应该使用返回的实际列名

如果上述方法适用,那就没有问题了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM