【发布时间】:2021-04-06 16:01:12
【问题描述】:
我有一个连接到 MySQL 数据库的 C# 程序。我原来的 connectionString 嵌入在下面的代码中
public class RemoteDatabaseConnection
{
private MySqlConnection remoteConnect;
private string conStr;
public RemoteDatabaseConnection()
{
conStr = "server=" + AppSetting.serverIP + ";user id=ABCD;password=XYZERT;Database=" + AppSetting.databaseName;
}
public void Connect()
{
try
{
remoteConnect = new MySqlConnection(conStr);
}
catch (Exception ex)
{
MessageBox.Show("Connect Failed\n" + ex.Message);
}
}
}
Appsetting.serverIP和AppSetting.databaseName是从ini文件中加载的,可以修改。
但我发现有人在 app.config 中使用了 connectionString。喜欢
<connectionStrings>
<add name="conStr" connectionString="server=192.168.0.245;user id=ABCD;password=XYZERT;Database=service_report"/>
</connectionStrings>
谁能解释哪种方式更好更安全?
如果我想在app.config中使用connectionString,怎么会变成conStr = "server=" + AppSetting.serverIP + ";user id=ABCD;password=XYZERT;Database=" + AppSetting.databaseName;" ? 因为我的serverIP和databaseName不固定。
【问题讨论】:
-
硬编码用户名和密码总是一个坏主意。您可以轻松更改配置设置,甚至对其进行加密。
my serverIP and databaseName is not fixed.这是什么意思?每次运行应用程序时,甚至在应用程序运行时,服务器都会发生变化吗? -
顺便说一句,
RemoteDatabaseConnection类是一个等待发生的死锁。与 ADO.NET 的连接类和 no 处理连接的方式相比,它没有提供任何好处。连接应该是短暂的,在using块中声明,以便在使用后立即处理它们。这样,服务器上任何剩余的锁和资源都会被释放。 ADO.NET 使用连接池来降低打开新连接的成本。 -
如果您想使您的代码与不同的数据库产品一起工作,请使用抽象基类,例如 DbConnection、DbCommand,而不是像 MySqlConnection 或 SqlServerConnection 这样的具体类。也可以使用DB Provider model通过配置指定数据库产品。
-
"my serverIP and databaseName is not fixed" 表示我在不同的地方使用这个程序,所以这个工厂 ip 可能是 211.220.123.22,下一个工厂 ip 是 123.222.52.43。但是我编码时不知道IP地址。
-
在这种情况下,您可以在每台机器上的
app.config中存储不同的设置。所有这些内容都在 ADO.NET 教程、书籍和课程中进行了描述。不要试图猜测你的方式。仅这个类就会导致数据库的严重性能问题,而不仅仅是应用程序。如果您连接字符串以在另一点创建查询,您将允许 SQL 注入攻击