如何将数据从MySql数据库加载到列表中(基于控制台的应用程序)
本文关键字:控制台 应用程序 列表 数据 MySql 加载 数据库 | 更新日期: 2023-09-27 18:31:36
>我创建了一个包含 1 个表 "emp" 的数据库,其中包含一些数据。现在每次我启动应用程序时,我都想要一个列表来从 db 获取数据并将其保存在列表中,因为我想在运行时对数据执行一些计算,例如税收和总工资,仅用于显示(不想将其保存在 db 中)。我已经尝试了很多次,但我无法理解如何做到这一点。这是我的代码:
主类:
static void Main(string[] args)
{
empDB empDB1 = new empDB();
List<emplyee> empLST1 = new List<emplyee>();
if (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);
}
}
}
即使我的方法是否正确,我也不知道。我已经用谷歌搜索了几次,但我几天前才开始使用 .net,所以我不明白该怎么做。
好的,我试过这个,它也不起作用:
internal void GetDatabaseList()
{
List<employee> databases = new List<employee>();
MySqlConnection con = new MySqlConnection(ConnectionString);
{
con.Open();
DataTable tbl = con.GetSchema("Databases");
con.Close();
foreach (DataRow row in tbl.Rows)
{
databases.Add(row["hris"].ToString());
}
}
}
static void Main(string[] args)
{
empDB empDB1 = new empDB();
List<emplyee> empLST1 = new List<emplyee>();
**if (empLST1 == null)
{
empDB1.loadLST(out empLST1);
}**
}
这将始终为假,因为您将 empLST1 定义为新列表,这意味着它不为空
试试这个
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);
}
}
}
假设employee
类看起来像这样:
class employee
{
public string Name { get; set; }
public string Grade { get; set; }
}
我会像这样重写loadLST
:
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);
}
}
}
改进:
-
IDisposable
实现必须显式释放(请参阅此和此) - 为了避免手动映射代码,该代码映射来自数据读取器和对象(在您的情况下
employee
实例)的结果,代码使用自动映射器包 - 异常处理和
out
参数被丢弃。这里不需要异常处理和out
参数,除非你正在编写像TryToDoSomething
这样的方法(即使在这种情况下,你的方法也必须返回bool
来指示操作状态,并且只捕获特定的异常而不是Exception
)。
另请注意,您的代码不符合命名准则(例如,employee
应该Employee
)。