如何用更少的代码检查mysqldb中的条目
本文关键字:mysqldb 代码 何用更 检查 | 更新日期: 2023-09-27 18:20:32
嗨,我想知道是否有比我现在使用的方法更简单的方法来查找mysql数据库中是否有条目。
public static bool check_db_entry(string query)
{
using (var conn = new MySqlConnection(DbMethods.constr))
{
using (var cmd = new MySqlCommand(query, conn))
{
conn.Open();
using (var rdr = cmd.ExecuteReader())
{
if (rdr.Read() == false)
{
return false;
}
else
{
return true;
}
}
}
}
}
现在抛开只接受sql字符串的方法本身就不安全这一事实不谈,这对我来说是错误的。如果你要有接受任意sql命令的公共方法(记住:我说过"If"),那么毫无疑问,你有一个直接返回数据的方法。你应该以此为基础。这里有一个例子:
private static IEnumerable<IDataRecord> GetDataImpl(string query)
{
using (var conn = new MySqlConnection(DbMethods.constr))
using (var cmd = new MySqlCommand(query, conn))
{
conn.Open();
using (var rdr = cmd.ExecuteReader())
{
yield return rdr;
}
}
}
public static bool check_db_entry(string query)
{
return GetDataImpl(query).Any();
}
请注意,我将第一个方法列为private是有原因的。正如所写的那样,如果在将每个元素返回到程序中更高的抽象级别之前,不先复制读取器中的每个元素,它可能会产生奇怪的副作用。但你可以很容易地获得公共版本:
public static IEnumerable<T> GetData<T>(string query, Func<IDataRecord,T> copy)
{
return GetDataImpl(query).Select(copy);
}
抛开问题注释中指出的设计问题不谈,如果您想检查数据库中是否存在条目,则应始终使用COUNT(*)
:SELECT COUNT(*) FROM yourTable [WHERE theCondition]
进行查询。
如果这就是你传递给函数的全部内容,那么你可以简单地使用:
public static bool check_db_entry(string query)
{
using (var conn = new MySqlConnection(DbMethods.constr))
{
conn.Open();
using (var cmd = new MySqlCommand(query, conn))
{
return (int)cmd.ExecuteScalar() == 1;
}
}
}
如果你想简化它:
public static bool check_db_entry(string query)
{
using (var conn = new MySqlConnection(DbMethods.constr))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = query;
return (int)cmd.ExecuteScalar() == 1;
}
}