我正在寻找使用MariaDB服务器指定的不带用户名和密码的连接字符串的解决方案。我在同一台机器上运行应用程序和数据库服务器,所以我决定使用unix_socket身份验证。
复制步骤
我有两个连接字符串,其中两个变量都没有指定密码属性:
a(
string cnn_str = @"
Server=/run/mysqld/mysqld.sock;
Port=3306;
Database=mwsdb;
Protocol=unix;
AllowUserVariables=true;
UseAffectedRows=false;";
b(变体与第一个变体相同,仅扩展了uid
属性(因异常而受损(
// appends user name - user that runs the application
// in my case the user name is 'pi'
cnn_str += $"Uid={Environment.UserName};";
连接到数据库的代码:
1(仅MySqlConnector
var connection = new MySqlConnection(cnn_str);
using (connection)
{
connection.Open();
}
2(如何使用Pomelo.EF
和.UseMySql()
在Program.cs
中配置数据库上下文服务
builder.Services.AddDbContext<MwsDbContext>(dbContextOptions => dbContextOptions
/* either 2.1) */ .UseMySql(cnn_str, ServerVersion.AutoDetect(cnn_str))
/* or 2.2) */ // .UseMySql(new MySqlConnection(cnn_str), ServerVersion.AutoDetect(cnn_str))
);
问题
我使用简单的代码(控制台应用程序(来测试MariaDB的连通性,并将结果放入表中。
连接字符串我能在没有登录凭据的情况下组成连接字符串吗?
否。MySqlConnector要求指定UserID,即使使用Unix套接字也是如此。本期将对此进行介绍。
解决方法是显式设置用户名:
var builder = new MySqlConnectionStringBuilder("...connection string...");
builder.UserID = Environment.UserName;
using var connection = new MySqlConnection(builder.ConnectionString);
(或者只是连接字符串中的硬代码;Username = pi
。(
向我解释当作为参数传递给
.UseMySql(cnn_str vs. MySqlConnection)
时,MySqlConnection
实例相对于连接字符串的优点和潜在缺点。
这两种方法看起来相当等价:连接字符串与连接。
一种是使用所提供的连接字符串;另一个读取CCD_ 9属性并使用该连接字符串。前者的效率会稍高,因为它不会创建一个额外的MySqlConnection
对象来传递连接字符串;这在实践中可能可以忽略不计。