C# 如何将MySql数据库中的数据加载到列表中(基于控制台的应用程序)?

C# 如何将MySql数据库中的数据加载到列表中(基于控制台的应用程序)?,c#,mysql,console-application,C#,Mysql,Console Application,我已经创建了一个包含1个表“emp”的数据库,其中包含一些数据。现在,每次启动应用程序时,我都希望有一个列表从数据库中获取数据并将其保存在列表中,因为我希望在运行时对数据执行一些计算,例如仅用于显示的税收和工资总额(不希望将其保存在数据库中)。我已经试过很多次了,但我无法理解如何做到这一点。这是我的代码: 主要类别: static void Main(string[] args) { empDB empDB1 = new empDB(); List

我已经创建了一个包含1个表“emp”的数据库,其中包含一些数据。现在,每次启动应用程序时,我都希望有一个列表从数据库中获取数据并将其保存在列表中,因为我希望在运行时对数据执行一些计算,例如仅用于显示的税收和工资总额(不希望将其保存在数据库中)。我已经试过很多次了,但我无法理解如何做到这一点。这是我的代码:

主要类别:

    static void Main(string[] args)
    {
        empDB empDB1 = new empDB();
        List<emplyee> empLST1 = new List<emplyee>();

        if (empLST1 == null)
        {
            empDB1.loadLST(out empLST1);
        }
    }
static void Main(字符串[]args)
{
empDB empDB1=新的empDB();
List empLST1=新列表();
如果(empLST1==null)
{
empDB1.loadLST(out empLST1);
}
}
empDB类别:

class empDB
{
    private string ConnectionString = @"server=localhost;DATABASE=hris;uid=root;Password=123456;";

    internal void loadLST(out List<emplyee> loadedLST)
    {
        string query = "select name, grade from emp";
        try
        {
            MySqlConnection con = new MySqlConnection(ConnectionString);
            con.Open();

            MySqlDataReader rdr = null;
            MySqlCommand cmd = new MySqlCommand(query, con);

            rdr = cmd.ExecuteReader();

            while(rdr.Read())
            {
                List<employee> returnedLst = new List<employee>();
                returnedLst.Add(rdr["name"].ToString(), rdr["grade"].ToString());
            }
            loadedLst = returnedLst;
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}
类empDB
{
私有字符串ConnectionString=@“服务器=localhost;数据库=hris;uid=root;密码=123456;”;
内部无效加载LST(输出列表加载LST)
{
string query=“从emp中选择名称、等级”;
尝试
{
MySqlConnection con=新的MySqlConnection(ConnectionString);
con.Open();
MySqlDataReader rdr=null;
MySqlCommand cmd=新的MySqlCommand(查询,con);
rdr=cmd.ExecuteReader();
while(rdr.Read())
{
List returnedLst=新列表();
returnedLst.Add(rdr[“name”].ToString(),rdr[“grade”].ToString());
}
loadedLst=返回的LST;
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
}
}
我不知道我的方法是否正确。我在谷歌上搜索过几次,但几天前我才开始在.net上工作,所以我不知道怎么做

好的,我试过这个,但它也不起作用:

internalvoid GetDatabaseList()
{
列表数据库=新列表();
MySqlConnection con=新的MySqlConnection(ConnectionString);
{
con.Open();
DataTable tbl=con.GetSchema(“数据库”);
con.Close();
foreach(tbl.Rows中的数据行)
{
databases.Add(第[“hris”].ToString()行);
}
}
}

假设
employee
类如下所示:

class employee
{
    public string Name { get; set; }
    public string Grade { get; set; }
}
internal List<employee> loadLST()
{
    string query = "select name, grade from emp";

    // we should dispose IDisposable implementations:
    // connection, command and data reader
    using (var con = new MySqlConnection(ConnectionString))
    {
        con.Open();

        using (var cmd = new MySqlCommand(query, con))
        using (var rdr = cmd.ExecuteReader())
        {
            // it is hard to maintain manual mapping
            // between query results and objects;
            // let's use helper like Automapper to make this easier
            Mapper.CreateMap<IDataReader, employee>();
            Mapper.AssertConfigurationIsValid();

            return Mapper.Map<List<employee>>(rdr);
        }
    }
}
我会像这样重写
loadLST

class employee
{
    public string Name { get; set; }
    public string Grade { get; set; }
}
internal List<employee> loadLST()
{
    string query = "select name, grade from emp";

    // we should dispose IDisposable implementations:
    // connection, command and data reader
    using (var con = new MySqlConnection(ConnectionString))
    {
        con.Open();

        using (var cmd = new MySqlCommand(query, con))
        using (var rdr = cmd.ExecuteReader())
        {
            // it is hard to maintain manual mapping
            // between query results and objects;
            // let's use helper like Automapper to make this easier
            Mapper.CreateMap<IDataReader, employee>();
            Mapper.AssertConfigurationIsValid();

            return Mapper.Map<List<employee>>(rdr);
        }
    }
}
内部列表loadLST()
{
string query=“从emp中选择名称、等级”;
//我们应该处理IDisposable实现:
//连接、命令和数据读取器
使用(var con=newmysqlconnection(ConnectionString))
{
con.Open();
使用(var cmd=newmysqlcommand(query,con))
使用(var rdr=cmd.ExecuteReader())
{
//很难维护手动映射
//在查询结果和对象之间;
//让我们使用像Automapper这样的助手来简化这个过程
CreateMap();
assertConfigurationsValid();
返回Mapper.Map(rdr);
}
}
}
改进:

  • IDisposable
    必须明确地处理实现(请参阅和)
  • 为了避免手动映射代码,该代码映射来自数据读取器和对象的结果(
    employee
    实例,在您的情况下),代码使用包
  • 异常处理和
    out
    参数被丢弃。这里不需要异常处理和
    out
    参数,除非您正在编写类似
    TryToDoSomething
    的方法(即使在这种情况下,您的方法也必须返回
    bool
    以指示操作状态,并且只捕获特定异常,而不是
    异常
还要注意,您的代码不匹配(例如,
employee
应该是
employee
)。

静态void Main(字符串[]args)
{
empDB empDB1=新的empDB();
List empLST1=新列表();
**如果(empLST1==null)
{
empDB1.loadLST(out empLST1);
}**
}
这将始终为false,因为您将empLST1定义为一个新列表,这意味着它不为null

试试这个

public class Employee
{
    public string Name { get; set; }
    public string Grade { get; set; }
}

static void Main(string[] args)
{
    empDB empDB1 = new empDB();
    List<Employee> empLST1 = new List<Employee>();

    empDB1.loadLST(ref empLST1);
}

public class empDB
{
    public void loadLst(ref List<Employee> loadedLST)
    {
        string query = "select name, grade from emp";
        try
        {
            MySqlConnection con = new MySqlConnection(ConnectionString);
            con.Open();

            MySqlDataReader rdr = null;
            MySqlCommand cmd = new MySqlCommand(query, con);

            rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                Employee emp = new Employee();
                emp.Name = rdr["name"].ToString();
                emp.Grade = rdr["grade"].ToString();

                loadedLST.Add(emp);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}
公共类员工
{
公共字符串名称{get;set;}
公共字符串等级{get;set;}
}
静态void Main(字符串[]参数)
{
empDB empDB1=新的empDB();
List empLST1=新列表();
empDB1.loadLST(参考模板1);
}
公共类empDB
{
公共无效加载列表(参考加载列表)
{
string query=“从emp中选择名称、等级”;
尝试
{
MySqlConnection con=新的MySqlConnection(ConnectionString);
con.Open();
MySqlDataReader rdr=null;
MySqlCommand cmd=新的MySqlCommand(查询,con);
rdr=cmd.ExecuteReader();
while(rdr.Read())
{
员工emp=新员工();
emp.Name=rdr[“Name”].ToString();
emp.Grade=rdr[“Grade”].ToString();
加载的LST.Add(emp);
}
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
}
}

为什么不使用实体框架?“原始”ADO.NET是必需的吗?@Dennis是的,它是必需的,因为我还没有学习实体框架,所以我也不允许使用它。好的,明白了,你有什么loadLST方法的解决方案吗?@MansoorAkram:当然你必须安装NuGet包(请参阅automapper.org上的说明)。