จะเชื่อมต่อกับฐานข้อมูล MySQL ได้อย่างไร?


88

ฉันใหม่มากสำหรับการเขียนโปรแกรม C # แต่ต้องการเข้าถึงฐานข้อมูล MySQL (ไม่มีเงินสำหรับ MS SQL)

อย่างไรก็ตามฉันมีคำถามหนึ่งข้อ ฉันรู้ว่าคุณจำเป็นต้องมี "MySQL connector / NET" และ "MySQL for Visual Studio" เพื่อพัฒนาแอปพลิเคชัน C # แต่ผู้ที่ติดตั้งแอปพลิเคชันนั้นต้องการด้วยหรือไม่ (เป็นไปได้ไหมที่ฉันจะปล่อยตัวเชื่อมต่อ DLL ด้วยโปรแกรม)

ขอบคุณ

แก้ไข: ทั้งคู่จำเป็นสำหรับผู้ใช้ปลายทางหรือเพียงแค่ตัวเชื่อมต่อ? มีอะไรอีกไหมที่พวกเขาต้องการ?


4
ใช่สิ่งที่คุณต้องทำคือรวม DLL กับโปรแกรมของคุณซึ่งควรอยู่ในโฟลเดอร์ดีบัก / รีลีสเอาต์พุตของคุณแล้วเมื่อคุณเรียกใช้โปรแกรม
ohmusama

หมายเหตุ: MySQL สำหรับ Visual Studio ไม่ทำงานใน VS2010E
Enrique San Martín

สำหรับหมายเหตุข้างต้นโดย @ EnriqueSanMartín เวอร์ชัน 2.0และเวอร์ชัน 1.2 รองรับ Microsoft Visual Studio 2010แล้ว
Curiousity

ดูที่นี่หากคุณต้องการเชื่อมต่อกับ MySQL ผ่าน SSH แทนที่จะใช้โดยตรงบนพอร์ต 3306 stackoverflow.com/questions/10806799/…
Matthew Lock

คำตอบ:


99

ติดตั้งMySql.Dataแพ็คเกจ NuGet ของ 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();
        }        
    }
}

ตัวอย่าง:

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();
}

4
หากคุณอาจประสบปัญหาการเชื่อมต่ออินเทอร์เน็ตและคุณต้องการลองจนกว่าคุณจะเชื่อมต่อไม่ได้ ลบif (_instance == null)บรรทัด ทำให้เป็นbool result = falseค่าเริ่มต้นเนื่องจากอาจไม่ได้เชื่อมต่อเนื่องจากปัญหาการเชื่อมต่ออินเทอร์เน็ตและอื่น ๆ อีกมากมายจริง ๆ ไม่เพียงเพราะไม่ได้ตั้งชื่อฐานข้อมูล ในกรณีif (String.IsNullOrEmpty(databaseName)) return false;นั้นเพราะมันจะโยนข้อยกเว้นเป็นอย่างอื่นและอาจส่งคืนจริงซึ่งไม่ถูกต้อง อย่างไรก็ตามขอขอบคุณสำหรับรหัสที่สะอาด
วงเล็บ

2
เหตุใดคุณจึงมีการอ้างอิง "แบบวงกลม" กับตัวสร้างส่วนตัว ( new DBConnection();และprivate DBConnection())
Soleil - Mathieu Prévot

คุณต้องทำconnection = nullต่อไปDBConnection.Close()เพราะมันเป็นซิงเกิลตันและคุณอาจต้องการใช้อีกครั้ง
Roman

1
นี่เป็นการเริ่มต้นที่ดี! ฉันได้ขยายไปเล็กน้อยpublic bool IsConnect()แล้ว ในการใช้การเชื่อมต่อซ้ำหลังจากifคำสั่ง: else if (connection.State == System.Data.ConnectionState.Closed) { connection.Open(); }ในแอปพลิเคชันของคุณคุณสามารถทำได้dbCon.IsConnect()อีกครั้งหลังจากที่คุณปิดไปแล้วหลังจากการสืบค้นก่อนหน้านี้ ดังนั้นไม่ต้องทำconnection = null;ในDBConnection.Close()ขณะที่โรมันปัญหามิฉะนั้นการนำจะไม่ทำงาน
Larphoid

คำตอบที่ดี แต่ฉันจะเชื่อมต่อกับพอร์ตบางพอร์ตได้อย่างไร เครือข่ายของฉันคือทั้งข้อมูล dev, test และ live อยู่บนเซิร์ฟเวอร์เดียวกัน แต่อยู่คนละพอร์ต ฉันจะเชื่อมต่อกับพอร์ตเพียง 1 พอร์ตได้อย่างไร
Linux4Life531

54

คุณสามารถใช้ Package Manager เพื่อเพิ่มเป็นแพ็คเกจและเป็นวิธีที่ง่ายที่สุด คุณไม่ต้องการสิ่งอื่นใดในการทำงานกับฐานข้อมูล mysql

หรือคุณสามารถรันคำสั่งด้านล่างใน Package Manager Console

PM> Install-Package MySql.Data

NUGET Mysql.Data


หากคุณค้นหาผ่านหน้าต่าง "จัดการแพ็คเกจ NuGet" โปรดทราบว่าชื่อแพ็กเกจต้องตรงตามตัวพิมพ์เล็กและใหญ่ อาจจะไม่ใช่สิ่งที่ชัดเจนสำหรับคนที่มาจากผู้จัดการแพ็คเกจที่มีชื่อตัวพิมพ์เล็ก
Dimitry K

15

คุณต้องดาวน์โหลด MySQLConnection สุทธิได้มาจากที่นี่

จากนั้นคุณต้องเพิ่มลงMySql.Data.DLLใน MSVisualStudio ดังนี้:

  1. เปิดโครงการเมนู
  2. เพิ่ม
  3. ข้อมูลอ้างอิง
  4. เรียกดู C:\Program Files (x86)\MySQL\MySQL Connector Net 8.0.12\Assemblies\v4.5.2
  5. เพิ่ม MySql.Data.dll

หากต้องการทราบข้อมูลเพิ่มเติมโปรดป้อนคำอธิบายลิงก์ที่นี่

ในการใช้รหัสคุณต้องนำเข้าไลบรารี:

using MySql.Data.MySqlClient;

ตัวอย่างการเชื่อมต่อกับฐานข้อมูล Mysql (NO SSL MODE) โดยใช้เหตุการณ์ 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();
    }
  }

}

3

เมื่อดูโค้ดด้านล่างฉันลองแล้วพบว่า: แทนที่จะเขียนDBCon = DBConnection.Instance();คุณควรใส่DBConnection DBCon - new DBConnection();(ที่ได้ผลสำหรับฉัน)

และแทนที่จะMySqlComman cmd = new MySqlComman(query, DBCon.GetConnection());ใส่MySqlCommand cmd = new MySqlCommand(query, DBCon.GetConnection());(มันไม่มี d)


0

ห้องสมุดต้องพิจารณาก็คือ MySqlConnector, https://mysqlconnector.net/ Mysql.Data อยู่ภายใต้ใบอนุญาต GPL ในขณะที่ MySqlConnector คือ MIT


-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);
    }

15
คุณได้คัดลอกสิ่งนี้จากcodeproject.com/Articles/43438/Connect-C-to-MySQLนี่คือคำตอบจาก "การแข่งขัน Hamed Shams"
Elmue

ฉันเห็นด้วย @Elmue -
Momoro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.