0

我正在使用数据库将部门名称与其唯一的邮寄代码关联起来,即会计的邮寄代码为 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();

我已经尝试了多种不同的方法,即使只为此查询使用专有的连接、命令和阅读器。我SqlDataReader在代码的另一个函数中使用了具有相同两个字段的类似目的,并且它运行良好。任何见解将不胜感激。

4

3 回答 3

2

您需要 .Read() 从 SQl_Reader 获得任何数据。通常你会做

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

如果您确定只会返回一行,那么您应该将查询更改为

Select top 1 ShortName FROM 

但是你仍然需要 Read()。我也同意关于对注入攻击持开放态度的评论。您需要将 department_Text.SelectedValue 作为查询参数传递

于 2013-06-24T20:57:16.987 回答
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();
于 2013-06-24T20:53:26.203 回答
1

我假设 ID 是主键,所以没有其他可能的特定 ID 值,那么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来自动处理对象,更多关于它:如果关联的 SqlConnection 将被处理,是否需要 SqlCommand.Dispose()?.

于 2013-06-24T21:01:19.550 回答