我有一个方法来获取数据库中带锁标志的用户名计数
public bool UsernameExistInDatabase(string username)
{
bool states = false;
using (SqlConnection con = new SqlConnection(this._connectionString))
{
string query = "SELECT COUNT(username) FROM tbl_sample WHERE (lock = '1')";
SqlCommand cmd = new SqlCommand(query, con);
con.Open();
int result = Convert.ToInt32(cmd.ExecuteScalar());
con.Close();
if (result > 0)
{
states = true;
}
}
return states;
}
但我有三种不同的方式
SELECT COUNT(username) FROM tbl_sample WHERE (lock = '1')
SELECT COUNT(username) FROM tbl_sample WHERE (lock = 1)
SELECT COUNT(username) FROM tbl_sample WHERE (lock = 'true')
我应该为我的代码选择哪一个(即哪一个更好)
答案 0 :(得分:1)
奇怪的是,由于有很多方法可以指示为true,但是大多数数据库引擎可靠地将Zero视为false,我通常认为true为非False,如下所示:
SELECT COUNT(username) FROM tbl_sample WHERE (lock <> 0)
显然,如果NULL是一个问题,并且您希望NULL读为false,则必须执行以下操作:
SELECT COUNT(username) FROM tbl_sample WHERE (lock IS NOT NULL AND lock <> 0)
答案 1 :(得分:1)
使用where lock = 1
; '1'
和true
都会发生不必要的转换。此外,'true'
不正确。
整数数据类型,可以取值1,0或NULL。
<强>备注强>
字符串值TRUE和FALSE可以转换为位值:TRUE转换为1,FALSE转换为0.
答案 2 :(得分:0)
您应该始终向下一个必须处理您的代码的人明确表达您的意图。在这种情况下,您的列是一个不可为空的位列,其潜在值为0或1(忽略任何转换)。
SELECT COUNT(username) FROM tbl_sample WHERE lock = 1
这是你最好的方式 - 没有奇怪的内部转换,也没有混淆你的行为。
答案 3 :(得分:0)
我建议= 1,我无法拒绝重写你使用的方法......
public bool UsernameExistInDatabase(string username)
{
using (SqlConnection con = new SqlConnection(this._connectionString))
{
string query = "SELECT COUNT(username) FROM tbl_sample WHERE (lock = 1)";
con.Open();
using (SqlCommand cmd = new SqlCommand(query, con))
{
int result = Convert.ToInt32(cmd.ExecuteScalar());
if (result > 0)
{
// No worries about con.Close()! Using will handle it
return true;
}
}
}
return false;
}
我不得不说方法名称本身让我感到困惑 - 我们清楚地查找用户是否存在于数据库中并且已被锁定?我们是否按照方法名称建议将用户存在于数据库中?