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