2013-02-25 82 views
-2

我想在表单加载的数据库中获取多个数据。但是我发现代码很长并且重复。有人可以让这个代码缩短一点吗?在表单上加载数据库的多个数据加载

这是我的代码

private void Form1_Load(object sender, EventArgs e) 
    { 
     string a = label1.Text; 
     string connString = "Server=Localhost;Database=this;Uid=root;password=root"; 
     using (var connection = new MySqlConnection(connString)) 
     { 
      connection.Open(); 
      using (var command = connection.CreateCommand()) 
      { 
       command.CommandText = ("Select Room_name from firstfloor where Room_no=(?room)"); 
       command.Parameters.AddWithValue("?room", a); 
       command.ExecuteNonQuery(); 

       MySqlDataReader reader = command.ExecuteReader(); 
       while (reader.Read()) 
       { 
        button1.Text = reader["Room_name"].ToString(); 
       } 
      } 
     } 
     string b = label2.Text; 
     string connString2 = "Server=Localhost;Database=this;Uid=root;password=root"; 
     using (var connection = new MySqlConnection(connString2)) 
     { 
      connection.Open(); 
      using (var command = connection.CreateCommand()) 
      { 
       command.CommandText = ("Select Room_name from firstfloor where Room_no=(?room)"); 
       command.Parameters.AddWithValue("?room", b); 
       command.ExecuteNonQuery(); 

       MySqlDataReader reader = command.ExecuteReader(); 
       while (reader.Read()) 
       { 
        button2.Text = reader["Room_name"].ToString(); 
       } 
      } 

     } 
    } 
+0

这可能更适合CodeReview ... codereview.stackexchange.com,但是它可以做得更干净一点。例如......你真的需要有两个字段为同一个连接字符串? – Arran 2013-02-25 15:32:08

回答

1

首先要连接到同一个数据库中所有的两倍。 而你用同样的方法来做它(很明显,你是否完全决定是否只连接一次)。

其次你可以将实际的选择执行包装在一个单独的方法中。 这个单独的方法应该从调用者那里接收它的连接(因为你可以在这种特殊情况下只连接到数据库,但是可以根据需要进行多次选择)。

三,不要使用ExecuteReader,请使用ExecuteScalar。

更多:你不应该在FormLoad上做太多事情(UI会冻结)。 为什么你要根据标签的值查询数据库? 仅仅是您写的一个样本能够真正快速地向我们展示您的意思,还是实际的业务逻辑?

private string GetRoomName_BasedOn_RoomNumber(string roomNumber, MyConnection connection) { 
    using (var command = connection.CreateCommand()) 
    { 
     command.CommandText = ("Select Room_name from firstfloor where Room_no=(?room)"); 
     command.Parameters.AddWithValue("?room", roomNumber); 
     //command.ExecuteNonQuery(); 

     object response = command.ExecuteScalar(); 

     return response as string; // consider <null> as a "No such Room Number" signal 
    } 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    string a = label1.Text; 
    string b = label2.Text; 

    string connString = "Server=Localhost;Database=this;Uid=root;password=root"; 
    using (var connection = new MySqlConnection(connString)) 
    { 
     connection.Open(); 
     button1.Text = this.GetRoomName_BasedOn_RoomNumber(a, connection); 
     button2.Text = this.GetRoomName_BasedOn_RoomNumber(b, connection); 
    } 
} 
+0

关闭但你的代码中很少有错误,你在哪里声明了命令类型?并且您没有将连接分配给命令对象。 – 2013-02-25 15:43:22

+0

方法GetRoomName_BasedOn_RoomNumber没有重载'需要1个参数.. – 2013-02-25 15:46:42

+0

好吧..对不起'布特那。被带走了。请检查编辑 – 2013-02-25 15:47:28

0

例如,你可以重构你的代码和下面的代码提取到一个方法:

private void DoSomething(MySqlConnection connection) 
{    
using (var command = connection.CreateCommand()) 
     { 
      command.CommandText = ("Select Room_name from firstfloor where Room_no=(?room)"); 
      command.Parameters.AddWithValue("?room", b); 
      command.ExecuteNonQuery(); 

      MySqlDataReader reader = command.ExecuteReader(); 
      while (reader.Read()) 
      { 
       button2.Text = reader["Room_name"].ToString(); 
      } 
     } 

    }