在我的代码中,我总是得到' 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) { }
}
答案 0 :(得分:3)
您应该使用ExecuteScalar
代替ExecuteNotQuery
。
<强>的ExecuteNonQuery 强>:
<强>的ExecuteScalar 强>:
<强>的ExecuteReader 强>
答案 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)
ExecuteNonQuery
不会返回任何内容。对于所有其他类型的查询,它返回-1。
你想要的是ExecuteScalar
。请注意,查询结果也可以是NULL
(DBNull.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