Jak połączyć się z bazą danych MySQL?

85

Jestem bardzo nowy w programowaniu w C #, ale chciałbym mieć dostęp do baz danych MySQL (nie mam pieniędzy na MS SQL)

Mam jednak jedno pytanie; Wiem, że do tworzenia aplikacji C # wymagane jest posiadanie „MySQL connector / NET” i „MySQL for Visual Studio”, ale czy osoba, która instaluje aplikację, również ich wymaga? (Czy jest możliwe, że mogę po prostu zwolnić bibliotekę DLL łącznika za pomocą programu?)

Dzięki

EDYCJA: Czy oba z nich są wymagane dla użytkownika końcowego, czy tylko łącznik? Czy jest coś jeszcze, czego by potrzebowali?

user3282097
źródło
3
Tak, wszystko, co musisz zrobić, to spakować bibliotekę DLL z programem, powinna już znajdować się w folderze wyjściowym debugowania / wydania podczas uruchamiania programu.
ohmusama,
Uwaga: MySQL dla programu Visual Studio nie działa w VS2010E
Enrique San Martín
Jeśli chodzi o powyższą notatkę @ EnriqueSanMartín, usunięto obsługę wersji 2.0 i 1.2 dla Microsoft Visual Studio 2010 .
Ciekawość

Odpowiedzi:

96

Zainstaluj MySql.Datapakiet NuGet firmy Oracle .

using MySql.Data;
using MySql.Data.MySqlClient;

namespace Data
{
    public class DBConnection
    {
        private DBConnection()
        {
        }

        private string databaseName = string.Empty;
        public string DatabaseName
        {
            get { return databaseName; }
            set { databaseName = value; }
        }

        public string Password { get; set; }
        private MySqlConnection connection = null;
        public MySqlConnection Connection
        {
            get { return connection; }
        }

        private static DBConnection _instance = null;
        public static DBConnection Instance()
        {
            if (_instance == null)
                _instance = new DBConnection();
           return _instance;
        }

        public bool IsConnect()
        {
            if (Connection == null)
            {
                if (String.IsNullOrEmpty(databaseName))
                    return false;
                string connstring = string.Format("Server=localhost; database={0}; UID=UserName; password=your password", databaseName);
                connection = new MySqlConnection(connstring);
                connection.Open();
            }

            return true;
        }

        public void Close()
        {
            connection.Close();
        }        
    }
}

Przykład:

var dbCon = DBConnection.Instance();
dbCon.DatabaseName = "YourDatabase";
if (dbCon.IsConnect())
{
    //suppose col0 and col1 are defined as VARCHAR in the DB
    string query = "SELECT col0,col1 FROM YourTable";
    var cmd = new MySqlCommand(query, dbCon.Connection);
    var reader = cmd.ExecuteReader();
    while(reader.Read())
    {
        string someStringFromColumnZero = reader.GetString(0);
        string someStringFromColumnOne = reader.GetString(1);
        Console.WriteLine(someStringFromColumnZero + "," + someStringFromColumnOne);
    }
    dbCon.Close();
}
Ocph23
źródło
3
Jeśli możesz napotkać problemy z połączeniem internetowym i chciałbyś spróbować przed połączeniem, to nie zadziała. Usuń if (_instance == null)linię. Również bool result = falsedomyślnie, ponieważ może nie być podłączony z powodu problemów z połączeniami internetowymi i wielu innych, nie tylko dlatego, że nazwa bazy danych nie została ustawiona. W takim przypadku, if (String.IsNullOrEmpty(databaseName)) return false;ponieważ w przeciwnym razie po prostu zgłosi wyjątek i może nawet zwrócić wartość true, która nie byłaby poprawna. Jednak głos za przyjęciem, dzięki za czysty kod.
Przedziały
1
Dlaczego masz odwołanie „cykliczne” z prywatnym konstruktorem? ( new DBConnection();i private DBConnection())
Soleil - Mathieu Prévot
Trzeba by zrobić connection = nullna DBConnection.Close()ponieważ jest Singleton a może chcesz użyć go ponownie
Roman
1
To świetnie zacząć! Już trochę rozszerzyłem public bool IsConnect(). Aby ponownie użyć połączenia, po ifstwierdzeniu: else if (connection.State == System.Data.ConnectionState.Closed) { connection.Open(); }W swojej aplikacji możesz to zrobić dbCon.IsConnect()ponownie, po zamknięciu go po poprzednim zapytaniu. Więc nie rób connection = null;w DBConnection.Close()jak sugeruje Roman, poza ponownym nie zadziała.
Larphoid
Świetna odpowiedź, ale jak połączyć się z określonym portem. Moja sieć polega na tym, że zarówno dane deweloperskie, testowe, jak i bieżące znajdują się na tym samym serwerze, ale na różnych portach. Jak mogę podłączyć tylko do 1 portu.
Linux4Life531
54

możesz użyć Menedżera pakietów, aby dodać go jako pakiet i jest to najłatwiejszy sposób. Nie potrzebujesz niczego więcej do pracy z bazą danych mysql.

Lub możesz uruchomić poniższe polecenie w konsoli Menedżera pakietów

PM> Install-Package MySql.Data

NUGET Mysql.Data

Damith
źródło
Jeśli przeszukujesz go w oknie „Zarządzaj pakietami NuGet”, pamiętaj, że w nazwie pakietu jest rozróżniana wielkość liter . Może nie jest to takie oczywiste dla kogoś, kto pochodzi z menedżerów pakietów z małymi literami.
Dimitry K
13

Musisz pobrać MySQLConnection NET stąd .

Następnie musisz dodać MySql.Data.DLLdo MSVisualStudio w następujący sposób:

  1. Otwórz projekt menu
  2. Dodaj
  3. Odniesienie
  4. Przeglądaj do C:\Program Files (x86)\MySQL\MySQL Connector Net 8.0.12\Assemblies\v4.5.2
  5. Dodaj MySql.Data.dll

Jeśli chcesz dowiedzieć się więcej, odwiedź: wprowadź opis linku tutaj

Aby użyć w kodzie, musisz zaimportować bibliotekę:

using MySql.Data.MySqlClient;

Przykład połączenia z bazą danych MySQL (BEZ TRYBU SSL) za pomocą zdarzenia Click :

using System;
using System.Windows;
using MySql.Data.MySqlClient;


namespace Deportes_WPF
{

public partial class Login : Window
{
    private MySqlConnection connection;
    private string server;
    private string database;
    private string user;
    private string password;
    private string port;
    private string connectionString;
    private string sslM;

    public Login()
    {
        InitializeComponent();

        server = "server_name";
        database = "database_name";
        user = "user_id";
        password = "password";
        port = "3306";
        sslM = "none";

        connectionString = String.Format("server={0};port={1};user id={2}; password={3}; database={4}; SslMode={5}", server, port, user, password, database, sslM);

        connection = new MySqlConnection(connectionString);
    }

    private void conexion()
    {
        try
        {
            connection.Open();

            MessageBox.Show("successful connection");

            connection.Close();
        }
        catch (MySqlException ex)
        {
            MessageBox.Show(ex.Message + connectionString);
        }
    }

    private void btn1_Click(object sender, RoutedEventArgs e)
    {
        conexion();
    }
  }

}
Sergio Perez
źródło
3

Patrząc na poniższy kod, wypróbowałem go i stwierdziłem: Zamiast pisać DBCon = DBConnection.Instance();, powinieneś umieścić DBConnection DBCon - new DBConnection();(To zadziałało dla mnie)

a zamiast MySqlComman cmd = new MySqlComman(query, DBCon.GetConnection());ciebie należy umieścić MySqlCommand cmd = new MySqlCommand(query, DBCon.GetConnection());(brakuje d)

Nadzieja
źródło
-4
 private void Initialize()
    {
        server = "localhost";
        database = "connectcsharptomysql";
        uid = "username";
        password = "password";
        string connectionString;
        connectionString = "SERVER=" + server + ";" + "DATABASE=" + 
        database + ";" + "U`enter code here`ID=" + uid + ";" + "PASSWORD=" + password + ";";

        connection = new MySqlConnection(connectionString);
    }
neelakanta
źródło
15
Skopiowałeś to z codeproject.com/Articles/43438/Connect-C-to-MySQL To jest już odpowiedź z "bout Hamed Shams"
Elmue
Zgadzam się, @Elmue -
Momoro,