SqlDataReader导致网页无法加载

时间:2013-06-24 20:48:25

标签: c# sql sql-server

我正在使用数据库将Department的名称与其唯一的邮件代码相关联,即Accounting具有邮件代码1337. ShortName和ID是正在查询的数据库的字段。

架构是

  • ID int
  • ShortName nvarchar(255)

这是在使用C#的网页后端完成的。我在同一代码中的其他位置使用了SqlDataReader对象,但没有导致错误。我想我在某处有语法错误或者我试图将一个字符串插入一个int或傻事,但我看不到它。

SqlConnection设置正确,因为它在页面加载时用于查询,并在指示的行被注释掉时起作用。

SqlDataReader SQl_Reader;
string cmdString = "SELECT ShortName FROM departments WHERE (ID = " +
  department_Text.SelectedValue.ToString() + ")"; //a selected value in department_text would be the mailing code such as 1337, or 1304.

SqlCommand SQl_Command2 = new SqlCommand(cmdString, SQl_Connection);

SQl_Reader = SQl_Command.ExecuteReader();

string deptName = SQl_Reader["ShortName"].ToString();//This should assign the deptName = the value in SQl_Reader but it causes the page not to load. Not sure what is wrong with it

SQl_Reader.Close();
SQl_Connection.Close();

即使使用专有的Connection,Command和Reader,我也尝试过多种不同的方法。我在代码的另一个函数中使用了SqlDataReader用于类似的目的和相同的两个字段,它完美地工作。任何见解都将非常感激。

3 个答案:

答案 0 :(得分:2)

如果您打算使用阅读器,则需要在获取值之前致电Read()

如果您想获得单个值,那么最好使用ExecuteScalar()代替。

还使用参数化查询来防止SQL注入(以及其他好处)..

    SqlDataReader SQl_Reader;
    string cmdString = "SELECT ShortName FROM departments WHERE ID = @ID;"
    SqlCommand SQl_Command2 = new SqlCommand(cmdString, SQl_Connection);
    SQl_Command2.Parameters.Add("@ID", department_Text.SelectedValue);
    SQl_Reader = SQl_Command.ExecuteReader();
    SQl_Reader.Read();
    string deptName = SQl_Reader["ShortName"].ToString();

    SQl_Reader.Close();
    SQl_Connection.Close();

或更好......

    SqlDataReader SQl_Reader;
    string cmdString = "SELECT ShortName FROM departments WHERE ID = @ID;"
    SqlCommand SQl_Command2 = new SqlCommand(cmdString, SQl_Connection);
    SQl_Command2.Parameters.Add("@ID", department_Text.SelectedValue);
    SQl_Reader = SQl_Command.ExecuteReader();
    SQl_Reader.Read();
    string deptName = SQl_Command.ExecuteScalar() as String;

    SQl_Reader.Close();
    SQl_Connection.Close();

答案 1 :(得分:2)

你需要在SQl_Reader中使用.Read()才能拥有任何数据。 通常你会这样做

While (SQl_Reader.Read() )
{
   // Get values here
}

如果您确定只返回一行,则应将查询更改为

Select top 1 ShortName FROM 

但你还需要Read()。我同意关于对注射攻击开放的评论。您需要将department_Text.SelectedValue作为查询参数传递

答案 2 :(得分:1)

我认为ID是主键,因此没有其他可能的specyfic值,然后ExecuteScalar将完成这项工作。

string cmdString = "SELECT ShortName FROM departments WHERE (ID = @depId)";

using (SqlCommand SQl_Command2 = new SqlCommand(cmdString, SQl_Connection))
{
    //a selected value in department_text would be the mailing code such as 1337, or 1304.
    SQl_Command2.Parameters.Add("@depId", System.Data.SqlDbType.Int).Value = department_Text.SelectedValue;

    string deptName = (string)SQl_Command2.ExecuteScalar();
}

不要忘记使用SqlCommand.Parameters Property而不是字符串连接。

我很高兴使用using自动处理对象,更多关于它的信息:Is SqlCommand.Dispose() required if associated SqlConnection will be disposed?