0

嗨,我想知道是否有比我现在使用的更简化的方法来查找 mysql db 中是否有条目。

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;
                }
            }
        }
    }
}
4

2 回答 2

1

撇开问题评论中指出的设计问题不谈,如果要检查数据库中是否存在条目,则应始终使用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;
    }
}
于 2013-07-01T18:19:27.250 回答
1

暂且不说只接受 sql 字符串的方法本质上是不安全的这一事实,这对我来说是错误的。如果您将拥有接受任意 sql 命令的公共方法(请记住:我说的是“如果”),那么毫无疑问,您有一个可以直接返回数据的方法。你应该以此为基础。这是一个例子:

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();
}

请注意,我将第一种方法列为私有方法是有原因的。如所写,如果您不先复制阅读器中的每个元素,然后再将其返回到程序中的更高抽象级别,它可能会产生奇怪的副作用。但是你可以很容易地获得公共版本:

public static IEnumerable<T> GetData<T>(string query, Func<IDataRecord,T> copy)
{
    return GetDataImpl(query).Select(copy);
}
于 2013-07-01T18:29:37.447 回答