我正在使用数据库将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
用于类似的目的和相同的两个字段,它完美地工作。任何见解都将非常感激。
答案 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?。