【问题标题】:SQL Reading from a DB problem using a DataReader使用 DataReader 从 DB 读取 SQL 问题
【发布时间】:2011-03-18 13:35:47
【问题描述】:

我有一个用户表 (tblUsers),其中包含大学工作人员的详细信息。我正在尝试使用与所选模块关联的讲师姓名填充文本框。

我正在获取与特定模块关联的所有用户 ID,测试用户是否是讲师,如果是,那么我将 ID 添加到 ArrayList。

然后我遍历这个数组并在每次遍历当前 ID 的过程中调用下面的方法。

但是,如果您查看下面的方法,我正在使用 SqlDataReader 并且在从该行读取时遇到错误:

txtLecturerName.Text += myReader["First_Name"].ToString();

错误信息是: 'myReader["First_Name"]' 引发了类型为 'System.IndexOutOfRangeException' 的异常

我使用的表格布局在方法代码下方。对此的任何帮助将不胜感激,我只需一杯咖啡就可以将头穿过屏幕。

public void outputLecturerNames(string lecturerID)
{
    // Create a new Connection object using the connection string
    SqlConnection myConnection = new SqlConnection(conStr);

    // If the connection is already open - close it
    if (myConnection.State == ConnectionState.Open)
    {
        myConnection.Close();
    }

    // 'using' block allows the database connection to be closed
    // first and then the exception handling code is triggered.
    // This is a better approach than using a 'finally' block which
    // would close the connection after the exception has been handled.
    using (myConnection)
    {
        try
        {
            // Open connection to DB
            myConnection.Open();

            SqlCommand selectCommand = new SqlCommand(selectQuery, myConnection);

            // Declare a new DataReader
            SqlDataReader myReader;

            selectQuery = "SELECT * FROM tblUsers WHERE User_ID='";
            selectQuery += lecturerID + "'";

            myReader = selectCommand.ExecuteReader();

            while (myReader.Read())
            {
                txtLecturerName.Text += myReader["First_Name"].ToString();
                txtLecturerName.Text += " ";
                txtLecturerName.Text += myReader["Last_Name"].ToString();
                txtLecturerName.Text += " , ";
            }
            myReader.Close();
        }
        catch (Exception err)
        {
            Console.WriteLine("Error: " + err);
        }
    }
}

tbl 用户:

[User_ID][First_Name][Last_Name][Email_Address]

【问题讨论】:

  • tblUsers的结构是什么?错误说没有名为:First_Name 的列。
  • 您好 Fosco,列名在方法代码下方以正确的顺序列出。谢谢
  • 附注 - 连接用户输入字符串时要非常小心,或者更好地参数化查询或使用 ORM 工具。
  • 如果从 SQL 语句中删除 where 子句会发生什么?我想知道讲师 ID 中的某些内容是否导致 SQL 语句被修改(SQL 注入类型的东西)。另外,如果您使用 0 的索引会发生什么?在您对 devio 的回复中,您说您尝试使用 1 的索引。
  • 谢谢大家!你们都很棒!如果您查看该方法,您会发现我在分配 selectQuery 之前愚蠢地声明了我的 SqlCommand,这意味着我在查询中使用了错误的 select 语句 - 因此 IndexOutOfRange 异常。再次感谢。

标签: c# sql database arraylist sqldatareader


【解决方案1】:

在你的方法中,变量 selectQuery 没有被声明,它在被分配到 tblUsers 上的查询字符串之前被用作 SqlCommand 的参数。

【讨论】:

  • 你好 devio,你是正确的对不起之前没有说,但我已经在方法之外声明了字符串 selectQuery。
  • @Frank 将 selectQUery 分配给 SqlCommand 时的内容是什么?创建命令后设置 tblUsers 查询语句
  • 哈哈!!我刚刚通过第 100 万次逐行逐行发现了这一点!我的愚蠢错误是在分配 selectQuery 之前声明了 SqlCommand。我从错误的结果中读取数据。感谢您的所有帮助!
【解决方案2】:

您可能拼错了列名。

一般来说,你不应该写SELECT * FROM ...
相反,您应该只选择您需要的列。

这将通过仅查询您需要的信息来使您的程序运行得更快,并且可以产生更好的错误消息。

【讨论】:

  • 感谢 Slaks,我只想让代码首先发挥作用,然后我打算让它更高效 - 感谢您的建议。虽然它似乎不是一个列名......
【解决方案3】:

当未找到给定的列名时会创建此错误。如果你和我一样,你可能已经检查过好几次了,但是表名是否正确(正确的数据库、正确的架构)以及列名是否正确?

http://msdn.microsoft.com/en-us/library/f01t4cfy.aspx

您可以尝试完全限定表的名称 (database.dbo.tblUsers)。这将确保您击中您认为的牌桌。此外,尝试将列名放入 SQL 语句中。如果它们不正确,您的 SQL 语句将无法正常执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多