Ich suche nach einer Lösung, um die Verbindungszeichenfolge ohne Benutzernamen und Passwort zu verwenden, die mit dem MariaDB-Server angegeben sind. Ich führe App und DB-Server auf demselben Computer aus, daher habe ich mich für die Verwendung der unix_socket-Authentifizierung entschieden.
Schritte zum Reproduzieren
Ich habe zwei Verbindungszeichenfolgen, bei denen für keine Variante eine Kennworteigenschaft angegeben ist:
a)
string cnn_str = @"
Server=/run/mysqld/mysqld.sock;
Port=3306;
Database=mwsdb;
Protocol=unix;
AllowUserVariables=true;
UseAffectedRows=false;";
b) Variante ist die gleiche wie die erste, nur erweitert um die uid
Eigenschaft (inspiriert durch Ausnahme)
// appends user name - user that runs the application
// in my case the user name is 'pi'
cnn_str += $"Uid={Environment.UserName};";
Code zum Verbinden mit der Datenbank:
1) NurMySqlConnector
var connection = new MySqlConnection(cnn_str);
using (connection)
{
connection.Open();
}
2) Die Art und Weise, wie ich den DB-Kontextdienst bei der Program.cs
Verwendung von Pomelo.EF
and konfiguriere.UseMySql()
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))
);
Die Angelegenheit
Ich habe einfachen Code (Konsolen-App) verwendet, um die Konnektivität zu MariaDB zu testen und die Ergebnisse in eine Tabelle einzufügen.
Code | Verbindungszeichenfolge | Ergebnis |
---|---|---|
ein | a) | Ausnahme |
ein | b) | funktioniert |
2.1 | a) | Ausnahme |
2.1 | b) | funktioniert |
2.2 | a) | Ausnahme |
2.2 | b) | funktioniert |
Lösung des Problems
Kann ich eine Verbindungszeichenfolge ohne Anmeldeinformationen erstellen?
Nein. MySqlConnector erfordert die Angabe der Benutzer-ID, selbst wenn ein Unix-Socket verwendet wird. Dies wird in dieser Ausgabe behandelt.
Die Problemumgehung besteht darin, den Benutzernamen explizit festzulegen:
var builder = new MySqlConnectionStringBuilder("...connection string...");
builder.UserID = Environment.UserName;
using var connection = new MySqlConnection(builder.ConnectionString);
(Oder einfach ;Username = pi
in Ihrer Verbindungszeichenfolge fest codieren.)
Erklären Sie mir, welche Vor- und potenziellen Nachteile eine MySqlConnection
Instanz gegenüber der Verbindungszeichenfolge hat, wenn sie als Argument an übergeben wird .UseMySql(cnn_str vs. MySqlConnection)
.
Die beiden Methoden scheinen ziemlich gleichwertig zu sein: Verbindungszeichenfolge vs connection.
Man verwendet die bereitgestellte Verbindungszeichenfolge; der andere liest die DbConnection.ConnectionString
Eigenschaft und verwendet diese Verbindungszeichenfolge. Ersteres wäre etwas effizienter, da es kein zusätzliches MySqlConnection
Objekt erstellt, nur um die Verbindungszeichenfolge zu übergeben; Dies ist in der Praxis wahrscheinlich vernachlässigbar.
Keine Kommentare:
Kommentar veröffentlichen