如何在C#.NET的WPF中访问MySql数据库?

3
请帮我指导一下。我正在尝试使用WPF和Mysql服务器数据库开发Windows应用程序,应该采用哪种方法来建立与Mysql数据库的连接呢?
1) 实体框架 OR 2) ADO.NET OR 3) 其他方法
管理员的计算机需要安装mysql数据库,然后将mysql数据库访问给另外的(10个或更多)客户端系统,它们都处于网络连接状态。
在这里,只有一个MySql数据库位于管理员计算机上。所有其他客户机通过管理员计算机的IP地址访问MySql数据库。IP连接字符串如下所示:
 @"Data Source=10.0.0.101

另一件事是客户要求在客户端安装.exe文件时,应自动安装mysql服务器数据库(即xampp或其他等)。

我该怎么做呢?

我已经尝试过使用ADO.NET C#而不是EF来连接mysql以用于wpf windows应用程序,就像这样:

public void AddUserList( UserSetUp user)  
    {  

        dbConnection.Open();  
        string query = "INSERT INTO Tble_UserSetUp (FirstName, SurName, Email, PhoneNumber, UserName, Password,Computer_Name,IP_Address,CreatedBy, CreatedDate,IsActive,Function,Department) VALUES (@FirstName, @SurName, @Email, @PhoneNumber, @UserName, @Password,@Computer_Name,@IP_Address,@CreatedBy, @CreatedDate,@IsActive,@Function,@Department)";  
        MySqlCommand insertSQL = new MySqlCommand(query, (MySqlConnection)dbConnection);  
        insertSQL.Parameters.AddWithValue("@FirstName", user.FirstName);  
        insertSQL.Parameters.AddWithValue("@SurName", user.SurName);  
        insertSQL.Parameters.AddWithValue("@Email", user.Email);  
        insertSQL.Parameters.AddWithValue("@PhoneNumber", user.PhoneNumber);  
        insertSQL.Parameters.AddWithValue("@UserName", Encrypt(user.UserName));  
        insertSQL.Parameters.AddWithValue("@Password", Encrypt(user.Password));  
        insertSQL.Parameters.AddWithValue("@Computer_Name", user.Computer_Name);  
        insertSQL.Parameters.AddWithValue("@IP_Address", user.IP_Address);  
        insertSQL.Parameters.AddWithValue("@CreatedBy", user.CreatedBy);  
        insertSQL.Parameters.AddWithValue("@CreatedDate", user.CreatedDate);  
        insertSQL.Parameters.AddWithValue("@IsActive", user.IsActive);  
        insertSQL.Parameters.AddWithValue("@Function", user.Function);  
        insertSQL.Parameters.AddWithValue("@Department", user.Department);  
        try  
        {  
            insertSQL.ExecuteNonQuery();  
            dbConnection.Close();  
        }  
        catch (Exception ex)  
        {  
            throw new Exception(ex.Message);  
        }  
    }  

使用实体框架或其他类似的技术是不好的选择吗?


您可以通过设置先决条件来安装MySQL,请参考https://social.msdn.microsoft.com/Forums/windows/en-US/32bdcbcb-e9d2-40cd-8a5a-ec3530db2b32/create-an-installer-for-c-with-mysql?forum=winformssetup获取相关信息。 - Manoj Naik
EF使用ADO.NET。WPF与数据访问无关。两者都没有问题。不要随意尝试,首先决定是否需要ORM。顺便说一句,关于MySQL和ADO.NET有很多重复的问题。 - Panagiotis Kanavos
顺便问一下,实际问题是什么?按照现在的文本来看,可以总结为“我如何在.NET中访问数据库?” - Panagiotis Kanavos
@PanagiotisKanavos:你的意思是ADO.NET编写这样的代码是从MySQL到WPF应用程序插入和获取数据的唯一方法吗?如果是这样,我打算遵循这种ADO.NET代码风格来开发Windows应用程序。这个想法不错吗? - user5251429
@PanagiotisKanavos:我已经更改了我的问题标签。感谢您的建议。 - user5251429
请专注于一个问题。这个问题太广泛了,涉及到选择数据层(本身就很广泛)以及如何安装数据库。 - Gert Arnold
2个回答

1
public partial class MainWindow : Window
{
    /*mysql
     * 
     * 1. add nuget mysql.data.dll(desktop application)
     * 2. using MySql.Data.MySqlClient;
     * 3. code like bellow , you can try 
     */
    private StringBuilder sb = new StringBuilder();
    public MainWindow()
    {
        InitializeComponent();
        mysql();
        tbx.Text = sb.ToString();
    }
    private void mysql()
    {
        try
        {
            var connstr = "Server=localhost;Uid=root;Pwd=123456;database=world";
            using (var conn = new MySqlConnection(connstr))
            {
                conn.Open();

                using (var cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "select * from city where countryCode= @ID";
                    cmd.Parameters.AddWithValue("@ID", "100");
                    using (var reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            var ii = reader.FieldCount;
                            for (int i = 0; i < ii; i++)
                            {
                                if (reader[i] is DBNull)
                                    sb.AppendLine("null");
                                else
                                    sb.AppendLine(reader[i].ToString());
                            }

                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
}

您好先生,我会按照您的要求去做。另外一个问题是客户要求在客户端安装.exe文件时,应该自动安装MySQL服务器数据库(例如xampp或其他等等)。我该怎么做呢? - user5251429
@johnsonANDjohnson,您的意思是说,您在客户端机器上安装了MySQL服务器吗?通常我们会在服务器机器上安装MySQL服务器,并将服务器IP应用于“connstr”。 - chengzi
不,我是指在服务器机器上安装mysql。但客户希望在安装服务器机器的.exe Windows应用程序时自动安装mysql(有两个窗口应用程序,一个是客户端机器,另一个是服务器机器)。我该怎么做?或者我在考虑,不使用mysql,而是使用sqllite.s3db。这是一个好方法吗?请回复并给我建议。 - user5251429
Sqlite只是设计用于本地使用,不支持通过网络从其他计算机访问。据我所知,您必须在客户端服务器上安装MySQL并配置MySQL服务器。 - chengzi
管理员系统和客户端系统都已连接到网络。那么,我可以使用sqllite.s3db吗?因为客户要求我在管理员系统上提供一个.exe文件,但是mysql服务器(xampp或其他)应该同时自动安装。我该怎么做?请帮帮我。 - user5251429
关于sqlite,您可以阅读这个能否将SQLite用作客户端-服务器数据库。至于服务器(xampp或其他),是否会自动安装,抱歉,我不清楚。 - chengzi

-1

参考: 官方MySQL文档 - Connector/NET编程简介

步骤0: 安装MySql并创建数据库

步骤1: 创建WPF项目

步骤2: 使用Nuget包管理器安装MySql.Data包

(Visual Studio) 项目 > (点击) 管理NuGet包

选择浏览标签 > 搜索 Mysql.data > 选择 Mysql.data 包 > 安装

步骤3: 在我的情况下,我是在 MainWindow.xaml.cs 文件中创建连接。

使用MySql.Data和MySql.Data.MySqlClient

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

完整代码(与问题相关): MainWindow.xaml.cs 文件

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

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

namespace EAppartments
{

    public partial class MainWindow : Window
    {
        string connStr = "server=localhost;user=root;database=YourDBName;password=yourpassword";
        
        //Connect to MySql when app starts
        //you can use OnStartUp event as well
        public MainWindow()
        {
            InitializeComponent();
            connectToMySql();
        }


        private void connectToMySql()
        {
            MySqlConnection conn = new MySqlConnection(connStr);
            try
            {
                Console.WriteLine("Connecting to MySQL...");
                conn.Open();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            //close connection if you want
            conn.Close();
            Console.WriteLine("Done.");
        }
    }
}

有用的资源:

使用 WPF 应用程序执行 MySql 命令

WPF 应用程序的生命周期


2
这个回答如何解决问题?你只挑出了一个小短语(“创建连接”)。无论如何,这个问题太广泛了,涉及的范围从哪个数据层到如何安装数据库都有可能。此外,如果可以回答,请不要发布代码截图。 - Gert Arnold
@GertArnold 感谢您的建议。我是C# WPF开发和MySql方面的新手(有2-3周的经验)。 - Lojith Vinsuka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接