以下是代码:
string checkuser = "select * from [User] where UserName='" + txtusername.Text + "'";
SqlCommand com = new SqlCommand(checkuser, con);
int temp = Convert.ToInt32(com.ExecuteScalar().ToString());
con.Close();
if (temp == 1)
问题:
每当我运行以下代码时,都会出现输入字符串格式不正确的错误。
答案 0 :(得分:3)
尝试
string checkuser = "select count(*) from [User] where UserName=@UserName";
您的问题是ExecuteScalar
返回第一行,结果的第一列值,它无法转换为整数
如果您有数字列,例如age
,请执行以下操作
string checkuser = "select age from [User] where UserName=@UserName";
你的SQL语句广泛用于sql注入攻击,你最好使用参数
string sql= "select count(*) from [User] where UserName = @UserName";
using(SqlConnection con = new SqlConnection(conString))
using(SqlCommand cmd= new SqlCommand(sql, con))
{
con.Open();
cmd.Parameters.AddWithValue("@UserName", txtusername.Text);
int temp = Convert.ToInt32(cmd.ExecuteScalar().ToString());
if(temp == 1)
{}
}
答案 1 :(得分:1)
ExecuteScalar
返回第一行的第一列查询结果。看起来您的com.ExecuteScalar().ToString()
不是有效整数,这就是您收到此错误的原因。
如果您想统计查询,则需要使用SELECT COUNT(*)
代替SELECT *
请使用parameterized queries。这种字符串连接对SQL Injection攻击开放。
同时使用using
statement来处理您的SqlConnection
和SqlCommand
之类的内容;
using(SqlConnection con = new SqlConnection(strConnString))
using(SqlCommand com = con.CreateCommand())
{
string checkuser = "select COUNT(*) from [User] where UserName = @user";
com.CommandText = checkuser;
com.Parameters.AddWithValue("@user", txtusername.Text);
int temp = (int)com.ExecuteScalar();
if(temp == 1)
///
}
此外,您可以使用ExecuteScalar
获取特定列值的第一行,并在查询中指定专栏,例如SELECT columnname from [User]...
答案 2 :(得分:0)
您应该返回标量值。但是,在您的查询中,您返回的result set
与String
类型不是兼容。
因此,请按以下方式修改您的查询:
string checkuser = "select count(*) from [User] where UserName='" + txtusername.Text + "'";
以上只返回可以放入字符串的single value
。