C# 如何检查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();

嗨,我想知道是否有比我现在使用的更简单的方法来查找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;
                }
            }
        }
    }
}

撇开问题注释中指出的设计问题不谈,如果要检查数据库中是否存在条目,应始终使用
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,那么它还必须询问与该字符串分开的参数数据。没有例外。