2010-07-20 156 views
0

我有一张包含大学工作人员详细信息的用户(tblUsers)表。我正在尝试使用与选定模块关联的讲师姓名填充文本框。SQL使用数据读取器从数据库问题读取

我正在获取与特定模块关联的所有UserID,测试用户是否是演讲者,如果是这样,那么我将该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); 
     } 
    } 
} 

向tblUsers:

[User_ID][First_Name][Last_Name][Email_Address] 
+0

tblUsers的结构是什么?该错误表示没有名为First_Name的列。 – Fosco 2010-07-20 16:53:29

+0

Hi Fosco,列名称按照方法代码下方的正确顺序列出。谢谢 – Frank 2010-07-20 17:15:04

+0

在旁注 - 要非常小心地连接用户输入字符串或更好地参数化查询或使用ORM工具。 – 2010-07-20 17:23:42

回答

3

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

+0

嗨devio,你是正确的抱歉,因为之前没有说过,但我已经声明了方法外的字符串selectQuery。 – Frank 2010-07-20 17:17:32

+0

@Frank将它分配给SqlCommand时,selectQUery的内容是什么?您在创建命令 – devio 2010-07-20 17:49:52

+0

哈哈后设置tblUsers查询语句!我只是通过逐行排列第一百万次才发现这一点!我愚蠢的错误是在分配selectQuery之前声明SqlCommand。我正在从错误的结果中读取数据。感谢你的帮助! – Frank 2010-07-20 18:09:01

0

你可能拼错列名。

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

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

+0

感谢Slaks,我只想首先获得代码的功能,然后我打算让它更有效率 - 感谢您的建议。它似乎不是一个列名称虽然... – Frank 2010-07-20 17:19:04

0

未找到给定的列名时创建此错误。如果你像我一样,你可能会多次检查过它,但是表名是否正确(正确的数据库,正确的模式)并且列名是否正确?

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

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