首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQLConnection Conn.Connect()

MySQLConnection Conn.Connect()
EN

Code Review用户
提问于 2018-08-24 02:36:32
回答 1查看 141关注 0票数 1

我对使用数据库非常陌生,我想知道我在实现中是否犯了一些常见的设计缺陷。对于上下文,整个项目打算由单个用户使用。

我想要审查的代码:

代码语言:javascript
复制
class DatabaseConnection
{
    //properties
    private MySqlConnection _connection;
    public MySqlConnection Connection { get { return _connection; } }
    public AccountLogin AccountCredentials { get; }
    public DatabaseLogin DatabaseCredentials { get; }

    //constructor
    public DatabaseConnection(AccountLogin _AccCred,
                              DatabaseLogin _DBCred)
    {
        AccountCredentials = _AccCred;
        DatabaseCredentials = _DBCred;
    }

    public void Connect()
    {
        if (Connection != null)
        {
            return;
        }

        string[] UserInputs =
        {
            DatabaseCredentials?.DatabaseName,
            DatabaseCredentials?.Server,
            DatabaseCredentials?.Port,
            AccountCredentials?.Password,
            AccountCredentials?.Username
        };
        bool ChkInpts = Validators.NullStringValidator(UserInputs);

        if (!ChkInpts)
        {
            string ConnInfo = "server=" + DatabaseCredentials.Server + ";" +
                              "user=" + AccountCredentials.Username + ";" +
                              "database=" + DatabaseCredentials.DatabaseName +
                              "port=" + DatabaseCredentials.Port + 
                              "password=" + AccountCredentials.Password;
            _connection = new MySqlConnection(ConnInfo);

            try
            {
                Console.WriteLine("Connecting to " + DatabaseCredentials.DatabaseName + "...");
                _connection.Open();
                Console.WriteLine("Connection to " + DatabaseCredentials.DatabaseName + " successful.");
            }

            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }
    public void Close()
    {
        _connection.Close();
    }
}

相关守则:

代码语言:javascript
复制
class AccountLogin
{
    public string Username { get; }
    public string Password { get; }

    public AccountLogin(string _username, string _password)
    {
        Username = _username;
        Password = _password;
    }
}

class DatabaseLogin
{
    public string DatabaseName { get; }
    public string Server { get; }
    public string Port { get; }

    public DatabaseLogin(string _server, string _DatabaseName, string _port)
    {
        DatabaseName = _DatabaseName;
        Server = _server;
        Port = _port;
    }
}

static class Validators
{
    public static bool NullStringValidator(string[] _inputs)
    {
        bool _result = false;
        for (int i = 0; i < _inputs.Length; i++)
        {
            if (string.IsNullOrEmpty(_inputs[i]))
            {
                return _result = true;
            }
        }
        return _result;
    }
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2018-08-24 12:23:40

C#中参数的常规命名是camelCase:

AccountLogin _AccCred

看上去更像

代码语言:javascript
复制
AccountLogin accountLogin

我想知道:DatabaseCredentials?.DatabaseName是否有用?如果是DatabaseCredentials is null,那么您可以连接到哪个数据库?

如果DatabaseCredentials == null的话,我会抛出一个异常。这可能也适用于AccountCredentials

字符串连接是构建字符串的一种效率很低的方法:

而不是

代码语言:javascript
复制
string ConnInfo = "server=" + DatabaseCredentials.Server + ";" +
                              "user=" + AccountCredentials.Username + ";" +
                              "database=" + DatabaseCredentials.DatabaseName +
                              "port=" + DatabaseCredentials.Port + 
                              "password=" + AccountCredentials.Password;

使用任何一种

代码语言:javascript
复制
StringBuilder

代码语言:javascript
复制
String.Format("server={0};user={1};...", DatabaseCredentials.Server, AccountCredentials.Username,...);

字符串插值:

代码语言:javascript
复制
$"server={DatabaseCredentials.Server};user={AccountCredentials.Username};..."

MySqlConnection实现了IDisposable。因此,您的包装器也应该这样做,这样您就可以释放_connection对象,然后客户端可以像这样使用包装器:

代码语言:javascript
复制
using (DatabaseConnection dc = new DatabaseConnection(...))
{
  // Use the connection...
}

try-catch方法中的-statement对客户端没有任何用处,因为如果连接失败,则不会向客户端发出信号。要么重新抛出异常,抛出自己的新异常,要么简单地忽略这里的任何异常并让客户端处理它们。

在……里面

代码语言:javascript
复制
public void Close()
{
    _connection.Close();
}

您应该测试_connection == null

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/202359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档