C# 使用DataReader从数据库读取SQL时出现问题
我有一个用户表(tblUsers),其中包含大学员工的详细信息。我试图用与所选模块相关的讲师姓名填充一个文本框 我获取与特定模块关联的所有用户ID,测试该用户是否是讲师,如果是,则将该ID添加到ArrayList中 然后我遍历这个数组,并在每次遍历当前ID的过程中调用下面的方法 但是,如果您查看下面的方法,我使用的是SqlDataReader,在这一行中读取时出错: Text+=myReader[“First_Name”].ToString() 错误消息是: “myReader[“First_Name”]”引发了类型为“System.IndexOutOfRangeException”的异常 我使用的表格布局在方法代码下面。如果能帮上忙,我将不胜感激,因为我只需要一杯咖啡就可以把头伸到屏幕上了C# 使用DataReader从数据库读取SQL时出现问题,c#,sql,database,arraylist,sqldatareader,C#,Sql,Database,Arraylist,Sqldatareader,我有一个用户表(tblUsers),其中包含大学员工的详细信息。我试图用与所选模块相关的讲师姓名填充一个文本框 我获取与特定模块关联的所有用户ID,测试该用户是否是讲师,如果是,则将该ID添加到ArrayList中 然后我遍历这个数组,并在每次遍历当前ID的过程中调用下面的方法 但是,如果您查看下面的方法,我使用的是SqlDataReader,在这一行中读取时出错: Text+=myReader[“First_Name”].ToString() 错误消息是: “myReader[“First_N
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]
您可能拼错了一个列名 一般来说,您不应该编写
SELECT*FROM…
相反,您应该只选择所需的列
这将使您的程序运行更快,只需查询您需要的信息,并且可以生成更好的错误消息。您可能拼错了列名 一般来说,您不应该编写
SELECT*FROM…
相反,您应该只选择所需的列
这将使您的程序运行更快,只需查询您需要的信息,并且可以生成更好的错误消息。当找不到给定的列名时,会创建此错误。如果您和我一样,您可能已经检查过几次了,但是表名正确(正确的数据库、正确的模式)和列名正确吗
您可以尝试完全限定表名(database.dbo.tblUsers)。这将确保你在打你认为你是的那张桌子。另外,尝试将列的名称放入SQL语句中。如果它们不正确,您的SQL语句将无法正确执行。当找不到给定的列名时,将创建此错误。如果您和我一样,您可能已经检查过几次了,但是表名正确(正确的数据库、正确的模式)和列名正确吗
您可以尝试完全限定表名(database.dbo.tblUsers)。这将确保你在打你认为你是的那张桌子。另外,尝试将列的名称放入SQL语句中。如果它们不正确,您的SQL语句将无法正确执行。在您的方法中,变量selectQuery没有声明,在tblUsers上分配查询字符串之前,它被用作SqlCommand的参数。在您的方法中,变量selectQuery没有声明,在tblUsers上为其分配查询字符串之前,它被用作SqlCommand的参数。tblUsers的结构是什么?错误表明没有名为:First_Name.Hi Fosco的列,列名称按正确顺序列在方法代码下面。谢谢一个旁注-非常小心地连接用户输入字符串,或者更好地参数化查询或使用ORM工具。如果从SQL语句中删除where子句,会发生什么?我想知道讲师ID中是否有什么东西导致SQL语句被修改(SQL注入类型的东西)。另外,如果使用索引0,会发生什么情况?在您对devio的回复中,您说您尝试了索引1。谢谢大家!你们都很棒!如果你看一下这个方法,你会发现我在分配selectQuery之前愚蠢地声明了我的SqlCommand,这意味着我在查询中使用了错误的select语句——因此出现了IndexOutOfRange异常。再次感谢。tblUsers的结构是什么?错误表明没有名为:First_Name.Hi Fosco的列,列名称按正确顺序列在方法代码下面。谢谢一个旁注-非常小心地连接用户输入字符串,或者更好地参数化查询或使用ORM工具。如果从SQL语句中删除where子句,会发生什么?我想知道讲师ID中是否有什么东西导致SQL语句被修改(SQL注入类型的东西)。另外,如果使用索引0,会发生什么情况?在您对devio的回复中,您说您尝试了索引1。谢谢大家!你们都很棒!如果你看一下这个方法,你会发现我在分配selectQuery之前愚蠢地声明了我的SqlCommand,这意味着我在查询中使用了错误的select语句——因此出现了IndexOutOfRange异常。再次感谢。您好,devio,您好,很抱歉之前没有说出来,但我已在方法之外声明了字符串selectQuery。@Frank在您将selectQuery分配给SqlCommand时,它的内容是什么?您在创建commandHAHA之后设置了tblUsers查询语句!!我是第一百万次一行一行地走过去才发现这一点的!我愚蠢的错误是在分配selectQuery之前声明SqlCommand。我从错误的结果中读取数据。谢谢你的帮助!您好,devio,您好,很抱歉之前没有这么说,但我已在方法之外声明了字符串selectQuery。@Frank在您将selectQuery分配给SqlCommand时,它的内容是什么?您在创建commandHAHA之后设置了tblUsers查询语句!!我是第一百万次一行一行地走过去才发现这一点的!我愚蠢的错误是在分配selectQuery之前声明SqlCommand。我从错误的结果中读取数据。谢谢你的帮助!谢谢Slaks,我只是想首先让代码功能化,然后我打算让它更高效——谢谢你的建议。虽然它看起来不是一个列名…谢谢Slaks,我只是想得到代码