SQL查询总是在c#asp.net中返回-1

时间:2017-02-09 12:34:08

标签: c# asp.net sql-server-2008

在我的代码中,我总是得到' user_id'为-1。是什么错误的查询???

我也想要加入查询。

            using (SqlConnection con = new SqlConnection(connectionString))
            {
                try
                {
                    SqlCommand cmd;
                    if (con.State == ConnectionState.Closed)
                    {
                        con.Open();
                    }
                    var user = Page.User.Identity.Name;
                    cmd = new SqlCommand("select UserId from Users where UserName='"+user+"'", con);
                    var user_id=cmd.ExecuteNonQuery();
                    cmd = new SqlCommand("select Gender from UserDetails where userId='"+user_id+"'");
                    var gender = cmd.ExecuteNonQuery();
                    SqlDataReader rdr = cmd.ExecuteReader();
                    if (rdr.Read())
                    {

                    }
                }
                catch (Exception e) { }
            }

4 个答案:

答案 0 :(得分:3)

您应该使用ExecuteScalar代替ExecuteNotQuery

<强>的ExecuteNonQuery

  1. 不会返回任何数据。
  2. 用于插入和更新。
  3. 仅返回受影响的行数。
  4. <强>的ExecuteScalar

    1. 只返回一个值。
    2. 该值将是第一列的第一行值。
    3. <强>的ExecuteReader

      1. 用于命令对象。
      2. 它通过select语句返回数据库给出的值。

答案 1 :(得分:3)

首先,ExecuteNonQuery不会返回任何结果。如果要返回单个值,请使用ExecuteScalar。

其次,通过连接字符串来创建SQL语句,您很容易受到SQL注入和转换错误的影响。 Google for&#34; Bobby Tables&#34;。或者想象如果有人输入'; DELETE FROM Users;--作为用户名会发生什么。

第三,如果您想要检索用户的详细信息,不要执行两个单独的查询。使用JOIN,例如:

var query = "Select Gender from UserDetails d " +
            " inner Join Users on Users.UserId=d.UserID " + 
            " where UserName=@user";

var genderCmd=new SqlCommand(query);
genderCmd.Parameters.Add("@user",SqlDbType.NVarChar,30);

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

    genderCmd.Connection=con;
    genderCmd.Parameters["@user].Value=user;
    var gender=(string)genderCmd.ExecuteScalar();
    return gender;
}

您可以在字段中存储查询和命令,并在必要时重复使用它们,例如:

void InitializeCommands()
{
    var query = "Select Gender from UserDetails d " +
                " inner Join Users on Users.UserId=d.UserID " + 
                " where UserName=@user";

    _genderCmd=new SqlCommand(query);
    _genderCmd.Parameters.Add("@user",SqlDbType.NVarChar,30);

}

//....

public string GetGender(string user)
{
    using (SqlConnection con = new SqlConnection(connectionString))
    {
        con.Open();

        genderCmd.Connection=con;
        genderCmd.Parameters["@user"].Value=user;
        var gender=(string)genderCmd.ExecuteScalar();
        return gender;
    }
}

您可以使用Open,ExecuteScalar的异步版本来避免在等待服务器响应时阻塞线程,例如:

public Task<string> GetGender(string user)
{
    using (SqlConnection con = new SqlConnection(connectionString))
    {
        await con.OpenAsync();

        genderCmd.Connection=con;
        genderCmd.Parameters["@user"].Value=user;
        var gender=await genderCmd.ExecuteScalarAsync();
        return (string)gender;
    }
}

使用网络子系统级别的IO完成端口而不是线程来处理IO操作,如对数据库的调用。

答案 2 :(得分:0)

除了INSERT,DELETE或UPDATE的受影响记录数之外,

ExecuteNonQuery不会返回任何内容。对于所有其他类型的查询,它返回-1。

你想要的是ExecuteScalar。请注意,查询结果也可以是NULLDBNull.Value)。

答案 3 :(得分:0)

AS MSDN说,ExecuteNonQuery返回:

  

对于UPDATE,INSERT和DELETE语句,返回值为   受命令影响的行数。当a上存在触发器时   正在插入或更新的表,返回值包括数字   受插入或更新操作影响的行数和数字   受触发器或触发器影响的行数。对于所有其他类型的   语句,返回值为-1。如果发生回滚,则返回   值也是-1。

在您的情况下,您需要确保使用ExecuteScalar方法,该方法返回查询结果的第一个值。您还应该使用查询参数而不是将它们作为文本传递,因为它会导致您进行SQL注入

cmd = new SqlCommand("select UserId from Users where UserName= @user, con);
cmd.Parameters.AddWithValue("@user", user);
int user_id = Convert.ToInt32(cmd.ExecuteScalar()); //NOTE THAT YOU WILL ALWAYS HAVE TO CAST THE RESULT, AS IT RETURNS Object