Como se conectar ao banco de dados MySQL?

88

Sou muito novo em programação C #, mas gostaria de poder acessar os bancos de dados MySQL (não tenho dinheiro para o MS SQL)

No entanto, tenho uma pergunta; Eu sei que você deve ter "conector MySQL / NET" e "MySQL para Visual Studio" para desenvolver o aplicativo C #, mas a pessoa que instala o aplicativo também exige isso? (É possível que eu possa apenas liberar a DLL do conector com o programa?)

obrigado

EDIT: Ambos são necessários para o usuário final ou apenas o conector? Eles precisam de mais alguma coisa?

user3282097
fonte
4
Sim, tudo o que você precisa fazer é empacotar a DLL com seu programa; ela já deve estar na pasta de depuração / liberação de saída quando você executar o programa.
ohmusama
Nota: MySQL para Visual Studio não funciona no VS2010E
Enrique San Martín
Quanto à observação acima, por @ EnriqueSanMartín Versão 2.0 e Versão 1.2 O suporte para Microsoft Visual Studio 2010 foi removido .
Curiousity
Veja aqui se você precisa se conectar ao MySQL por SSH em vez de diretamente na porta 3306 stackoverflow.com/questions/10806799/…
Matthew Lock

Respostas:

99

Instale o MySql.Datapacote NuGet da Oracle .

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

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

        public string Server { get; set; }
        public string DatabaseName { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }

        private MySqlConnection Connection { get; set;}

        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={0}; database={1}; UID={2}; password={3}", Server, DatabaseName, UserName, Password);
                Connection = new MySqlConnection(connstring);
                Connection.Open();
            }
    
            return true;
        }
    
        public void Close()
        {
            Connection.Close();
        }        
    }
}

Exemplo:

var dbCon = DBConnection.Instance();
dbCon.Server = "YourServer";
dbCon.DatabaseName = "YourDatabase";
dbCon.UserName = "YourUsername";
dbCon.Password = "YourPassword";
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
fonte
4
Se você tiver problemas de conexão com a Internet e quiser tentar até se conectar, isso não funcionará. Excluir if (_instance == null)linha. Faça também bool result = falsepor padrão porque pode não estar conectado para problemas de conexão de internet e muitos outros na verdade, não apenas porque o nome do banco de dados não seria definido. Nesse caso, if (String.IsNullOrEmpty(databaseName)) return false;porque ele apenas lançará uma exceção de outra forma e pode até retornar verdadeiro, o que não seria correto. No entanto, votado positivamente, obrigado pelo código limpo.
Brackets
2
Por que você tem uma referência "circular" com um construtor privado? ( new DBConnection();e private DBConnection())
Soleil - Mathieu Prévot
Você teria que fazer connection = nullem DBConnection.Close()uma vez que é singleton e você pode querer usá-lo novamente
Roman
1
Isso é ótimo para começar! Já expandi um pouco public bool IsConnect(). Para reaproveitar a conexão, após o ifcomando: else if (connection.State == System.Data.ConnectionState.Closed) { connection.Open(); }Em sua aplicação, basta fazer de dbCon.IsConnect()novo, após fechá-la após uma consulta anterior. Portanto, não faça connection = null;em DBConnection.Close()como sugerido Roman, caso contrário, a reutilização não vai funcionar.
Larphoid de
Ótima resposta, mas como faço para conectar a uma determinada porta. Minha rede é que os dados de dev, teste e live estão no mesmo servidor, mas em portas diferentes. Como posso me conectar a apenas 1 porta.
Linux4Life531
54

você pode usar o Gerenciador de Pacotes para adicioná-lo como um pacote e é a maneira mais fácil de fazer. Você não precisa de mais nada para trabalhar com o banco de dados mysql.

Ou você pode executar o comando abaixo no console do gerenciador de pacotes

PM> Install-Package MySql.Data

NUGET Mysql.Data

Damith
fonte
Se você pesquisar na janela "Gerenciar pacotes NuGet", lembre-se de que o nome do pacote diferencia maiúsculas de minúsculas . Talvez não seja uma coisa tão óbvia para alguém vindo de gerenciadores de pacotes com nomes em letras minúsculas.
Dimitry K
15

Você deve fazer o download do MySQLConnection NET aqui .

Então você precisa adicionar MySql.Data.DLLao MSVisualStudio assim:

  1. Projeto de menu aberto
  2. Adicionar
  3. Referência
  4. Navegue até C:\Program Files (x86)\MySQL\MySQL Connector Net 8.0.12\Assemblies\v4.5.2
  5. Adicionar MySql.Data.dll

Se você quiser saber mais visite: insira a descrição do link aqui

Para usar no código, você deve importar a biblioteca:

using MySql.Data.MySqlClient;

Um exemplo com conexão ao banco de dados Mysql (NO SSL MODE) por meio do evento 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
fonte
3

Olhando para o código abaixo, eu tentei e descobri: Em vez de escrever DBCon = DBConnection.Instance();você deveria colocar DBConnection DBCon - new DBConnection();(funcionou para mim)

e em vez de MySqlComman cmd = new MySqlComman(query, DBCon.GetConnection());você deve colocar MySqlCommand cmd = new MySqlCommand(query, DBCon.GetConnection());(está faltando o d)

Esperança
fonte
0

Outra biblioteca a ser considerada é MySqlConnector, https://mysqlconnector.net/ . Mysql.Data está sob uma licença GPL, enquanto MySqlConnector é MIT.

Andrew
fonte
-5
 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
fonte
15
Você copiou isso de codeproject.com/Articles/43438/Connect-C-to-MySQL Esta já é a resposta de "bout Hamed Shams"
Elmue
Eu concordo, @Elmue -
Momoro