【问题标题】:IndexOutOfRangeException SqlCommand .NETIndexOutOfRangeException SqlCommand .NET
【发布时间】:2018-06-27 14:30:25
【问题描述】:

我想创建一个应用程序,该应用程序将使用我的数据库中的数据创建一个 .CSV 文件,但我收到此错误:

System.IndexOutOfRangeException:'CT_Num'

当我删除时:

command.CommandText = "SELECT [Actionnaire Pal] FROM f_comptet";

dataReader["[Actionnaire Pal]"].ToString() 

我不再收到任何错误。

class Program
{
    static void Main(string[] args)
    { 
        SqlConnection conn = DBUtils.GetDBConnection();

        conn.Open();

        SqlCommand command = conn.CreateCommand();
        command.CommandText = "SELECT CT_Num, [Actionnaire Pal] FROM F_COMPTET WHERE CG_NumPrinc = '4110000'";

        SqlDataReader dataReader = command.ExecuteReader();

        StreamWriter sw = new StreamWriter("C:\\facture.csv");

        while (dataReader.Read())
        {
            sw.WriteLine("FAAV" + ";" + "." + ";" + "02" + ";" + "JJ/MM/AAAA" + ";" + "A" + ";" + "11" + ";" + dataReader["CT_Num"].ToString() + dataReader["[Actionnaire Pal]"].ToString() + ";");
        }
            sw.Close();
    }
}

【问题讨论】:

  • 您只执行第二个 CommandText 语句。您覆盖了第一个,因此 CT_Num 不存在。因此,当您删除第二个时,将执行第一个。也许您想加入这两个表?
  • 哦,我看到这是同一张表,只需修复您的查询以包含两列 SELECT CT_Num, [Actionnaire Pal] FROM f_comptet WHERE CG_NumPrinc = '4110000'
  • 另外,当使用SqlDataReader 的索引运算符时,您不需要转义空格。例如。做dataReader["Actionnaire Pal"].ToString()
  • 感谢您的回答,我不知道连接两个表是否有问题,但即使是同一个表中的数据,我也有同样的错误
  • 另外,题外话,但你为什么要连接静态字符串而不是"FAAV;.;02;JJ/MM/AAAA..."

标签: c# sql sql-server ado.net


【解决方案1】:

改变

dataReader["[Actionnaire Pal]"]

dataReader["Actionnaire Pal"]

[] 只是告诉 SQL 从它们中的所有内容创建一个列名,而忽略空格(通常它会认为表示语句下一部分的开始)。它们实际上并不构成最终列名的一部分。

【讨论】:

  • 感谢您的回答,它可以工作,但是当我从另一个表中添加数据时,我遇到了同样的错误,System.IndexOutOfRangeException : 'CT_Num'。我必须在我的请求中加入表格吗?
  • 我可以添加这个SqlCommand command = conn.CreateCommand(); command.CommandText = "SELECT CT_Num, [Actionnaire Pal] FROM F_COMPTET where CG_NumPrinc = '4110000'"; command.CommandText = "SELECT D_CodeRegion FROM p_dossier";dataReader["D_CodeRegion"].ToString()
  • 这不是您连接表格的方式。您所做的只是在第一个语句中声明一个查询,然后声明另一个完全独立的查询,它覆盖第一个查询。第一个永远不会被执行。您只需在 CommandText 属性中将一个字符串替换为另一个字符串。查尔斯已经在对该问题的第一条评论中向您解释了这一点。如果两个表之间存在关系,则使用 JOIN 运算符编写单个 SQL 语句将结果组合在一起。如果它们不相关,则需要执行两个单独的查询。
  • CommandText 属性是一个简单的字符串。你给它一个 SQL 查询来执行。它会存储该值,直到您运行 ExecuteReader 方法 - 那时它会执行 CommandText 属性中的任何内容。如果您在运行 ExecuteReader 之前多次更改 CommandText 属性的值,那么它只会执行您将其更改为的最后一个值,因为这是在 ExecuteReader 运行时它在那里找到的值。它不是包含多个查询的数组。即使它,结果也会是多个不同的dataReader,所以你的代码仍然会失败。
  • 我理解得更好,我创建了两个单独的查询,感谢您的解释。我也有几个数据读取器,我有这个错误:与此命令关联的数据读取器已经打开。必须先关闭它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多