C# 如何检查mysql数据库中代码较少的条目
嗨,我想知道是否有比我现在使用的更简单的方法来查找mysql数据库中是否有条目C# 如何检查mysql数据库中代码较少的条目,c#,mysql,performance,C#,Mysql,Performance,嗨,我想知道是否有比我现在使用的更简单的方法来查找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();
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;
}
}
}
}
}
撇开问题注释中指出的设计问题不谈,如果要检查数据库中是否存在条目,应始终使用
COUNT(*)
:SELECT COUNT(*)从表[条件所在位置]
进行查询
如果这就是传递给函数的全部内容,则只需执行以下操作:
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;
}
}
暂且不说只接受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静态IEnumerable GetDataImpl(字符串查询)
{
使用(var conn=newmysqlconnection(DbMethods.constr))
使用(var cmd=newmysqlcommand(query,conn))
{
conn.Open();
使用(var rdr=cmd.ExecuteReader())
{
收益率;
}
}
}
公共静态bool check\u db\u条目(字符串查询)
{
返回GetDataImpl(query.Any();
}
注意,我将第一个方法列为private是有原因的。如前所述,如果在程序中将每个元素返回到更高的抽象级别之前,不先将其复制到读取器中,那么它可能会产生奇怪的副作用。但您可以很容易地获得公共版本:
public static IEnumerable<T> GetData<T>(string query, Func<IDataRecord,T> copy)
{
return GetDataImpl(query).Select(copy);
}
公共静态IEnumerable GetData(字符串查询,函数复制)
{
返回GetDataImpl(查询),选择(复制);
}
每次调用此函数时是否都要启动新连接?“表演会很糟糕的。”特伦特说,这是正确的做法。Net中的连接是池连接,因此这实际上相当有效。首先,您可以这样做:返回rdr.Read()
这里真正糟糕的是方法签名实际上迫使您编写非常不安全的代码。如果这是你的主要数据访问模式,你实际上是在乞求被黑客攻击,这是无关紧要的。很多黑客都是内部工作。如果在某个级别上没有db访问,该方法就不会要求sql字符串。如果您有一个方法,任何一个方法,它接受一个sql字符串作为参数,并打算执行该sql,那么它还必须询问与该字符串分开的参数数据。没有例外。