2014-11-24 48 views
0

我已经创建了一个包含一个表“emp”的数据库,并在其中包含一些数据。现在,每次我启动应用程序时,我都想要一个列表从db获取数据并将其保存在列表中,因为我想在运行时对数据执行一些计算(如税和Gross-Salary)以供仅显示(不想保存它在db)。我已经尝试了很多次,但我无法理解这是如何做到的。这是我的代码:如何从MySql数据库加载数据到列表(基于控制台的应用程序)?

主类:

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

为什么不使用实体框架?是“原始的”ADO .NET是一项要求吗? – Dennis 2014-11-24 08:07:29

+0

@丹尼斯是的,它是必需的,因为我没有学过实体框架,所以我也不允许使用它。 – 2014-11-24 08:10:21

回答

1
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); 
     } 
    } 
} 
+0

好吧,有没有解决loadLST方法的方法? – 2014-11-24 09:16:50

+0

请看我编辑的答案^ – Taksil 2014-11-24 09:27:47

1

假设,即认为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实现必须被明确地设置(参见thisthis
  • 避免手工映射代码,它从数据读取器和对象的结果映射(employee实例你的情况),代码使用Automapper
  • 异常处理和out参数被丢弃。这里不需要异常处理和out参数,除非您正在编写像TryToDoSomething这样的方法(甚至在这种情况下,您的方法必须返回bool来指示操作状态,并且只捕获特定异常而不是Exception)。

另外请注意,您的代码不匹配naming guidelines(例如,employee应该Employee)。

+0

好吧,我会检查并让你知道。 – 2014-11-24 09:16:14

+0

@MansoorAkram:当然你必须安装NuGet包(参见automapper.org的说明)。 – Dennis 2014-11-24 09:17:53

相关问题