以下查询有什么问题?

时间:2013-05-27 10:53:27

标签: asp.net sql database

我有一个包含姓名,姓名和电子邮件的表格。我想从表中检索它们,所以我写道:

if (LoginAs.SelectedValue == "Administrator")
{
    string result;
    string query = "Select * from AdminTable where ID='"+ idBox.Text +"'";
    cmd1 = new SqlCommand(query, con);
    result = Convert.ToString(cmd1.ExecuteScalar());

    Response.Redirect("Admin.aspx");
    //Admin user = new Admin(idBox.Text, "Active",  mail, firstName, LastName, passwordBox.Text);
}

问题是,它只返回指定行的名称字段,即使我写了“Select *”。这有什么不对?

4 个答案:

答案 0 :(得分:4)

您必须尝试ExecuteReader()而不是ExecuteScalar()

ExecuteScaler用于我们必须读取单个值的情况.eg:

  

从tablename中选择count(*)。

  

ExecuteReader用于任何具有多行/列的结果集   (例如,来自TableName的SELECT *)

答案 1 :(得分:4)

ExecuteScalar只返回第一行的第一列,而忽略其余的一行。

所以你应该使用ExecuteReader方法。来自MSDN的一个例子:

using (SqlConnection connection = new SqlConnection(
           connectionString))
{
    connection.Open();

    SqlCommand command = new SqlCommand(queryString, connection);
    SqlDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        Console.WriteLine(String.Format("{0}", reader[0]));
    }
}

请注意while (reader.Read())检查您的查询是否返回(更多)结果并将光标定位在下一条记录上,然后您可以阅读。此示例打印第一列的值 using语句确保连接在使用后关闭,无论发生什么。

另外,不要直接使用用户输入构建查询(例如TextBox的值),而是使用parameters来防止SQL注入攻击。

答案 2 :(得分:2)

示例代码:

 string myQuery="Select * from AdminTable where ID=@myid";
 SqlCommand cmd=new SqlCommand(myQuery,conn);
 cmd.Parameters.AddWithValue("@myid", value);
 conn.Open();
 SqlDataReader dreader;
 dreader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
 while (dreader.Read())
 {
    string Value1= dreader["COl1"].ToString();
    string Value2= dreader["COl2"].ToString();
 }  
 dreader.Close(); 

始终使用参数化查询

答案 3 :(得分:1)

您可以尝试使用cmd1.ExecuteReader()