C# 错误:System.IndexOutOfRangeException

C# 错误:System.IndexOutOfRangeException,c#,sql,sql-server,C#,Sql,Sql Server,我需要您的帮助,当我在文本框中键入内容时,它会向我发送以下错误:“System.IndexAutoFrangeException”和其他信息:“B.Nombre”。 我不知道它可能是什么,我正在寻找错误,甚至尝试使用参数,什么也不做。 谢谢 您需要为列名添加别名。 因此,您的查询应该如下所示,例如: var strcn = System.Configuration.ConfigurationManager.ConnectionStrings["ConexionDB"].ToString();

我需要您的帮助,当我在文本框中键入内容时,它会向我发送以下错误:“System.IndexAutoFrangeException”其他信息:“B.Nombre”。 我不知道它可能是什么,我正在寻找错误,甚至尝试使用参数,什么也不做。 谢谢


您需要为列名添加别名。
因此,您的查询应该如下所示,例如:

var strcn = System.Configuration.ConfigurationManager.ConnectionStrings["ConexionDB"].ToString();

using (SqlConnection con = new SqlConnection(strcn))
{
    con.Open();
    string commandString = @"SELECT  
           B.Nombre as BNombre,G.Nombre as GNombre,D.Nombre as DNombre,B.Precio as BPrecio ,G.Precio as GPrecio,D.Precio as DPrecio,
           B.Gramos as BGramos,G.Gramos as GGramos,D.Gramos as DGramos,B.Tabletas as BTabletas,G.Tabletas as GTabletas,D.Tabletas as DTabletas
       FROM TblBenavides B INNER JOIN TblGuadalajara G ON B.Nombre = G.Nombre 
                           INNER JOIN TblDelAhorro D ON G.Nombre = D.Nombre 
       WHERE B.Nombre='" + TxtMedicamento.Text + "'" +
             "AND G.Nombre='" + TxtMedicamento.Text + 
             "' AND D.Nombre='" + TxtMedicamento.Text + "'";
    SqlCommand cmd = new SqlCommand(commandString, con);
    SqlDataReader myReader = cmd.ExecuteReader();
    if (myReader.Read())
    {
        label3.Text = myReader["BNombre"].ToString();
        label4.Text = myReader["GNombre"].ToString();
        label5.Text = myReader["DNombre"].ToString();
        this.label8.Text = myReader["BPrecio"].ToString();
        this.TxtGprecio.Text = myReader["GPrecio"].ToString();
        this.TxtDprecio.Text = myReader["DPrecio"].ToString();
        this.label6.Text = myReader["BGramos"].ToString();
        this.TxtGgramos.Text = myReader["GGramos"].ToString();
        this.TxtDgramos.Text = myReader["DGramos"].ToString();
        this.label7.Text = myReader["BTabletas"].ToString();
        this.TxtGtabletas.Text = myReader["GTabletas"].ToString();
        this.TxtDtabletas.Text = myReader["DTabletas"].ToString();
    }
}

B.Nombre
G.Nombre
D.Nombre
都具有相同的列名,因为您没有为它们指定别名。
B
G
D
前缀只是表名的别名,但它们不是列名的一部分。因此,您不能使用
myReader[“B.Nombre”]
(例如),因为该列不存在(这就是异常的原因)

而是为这些列使用列别名,或使用列索引的
int
-indexer

SELECT B.Nombre As B_Nombre,G.Nombre As G_Nombre, D.Nombre As D_Nombre
...
然后您可以使用这些名称,例如:

 label3.Text = myReader["B_Nombre"].ToString();
您还可以使用
int
-索引器:

 label3.Text = myReader[0].ToString(); // first column in the select


不要连接字符串来构建sql查询,例如,为了避免sql注入。

从读卡器获取数据时,请确保使用了正确的列名。数据集中不存在“B.Nombre”。列名使用别名。更改选择查询选择B.Nombre为B_Nombre,G.Nombre为G_Nombre添加列别名(B.Nombre为Nombre,…)后,请花点时间了解什么是Sql注入,以及为什么您的代码是一场等待发生的灾难,还要注意其他人在评论中所说的,以及@TimSchmelter关于sql注入的出色回答。至少不建议直接从UI连接。
 label3.Text = myReader[0].ToString(); // first column in the select