2017-04-13 41 views
0

我目前正在編寫一個簡單的程序來獲取4個表。我可以單獨獲取數據,但不能按順序獲取數據。c#連接在獲取多個表時必須有效且打開

DBConnection的代碼:在使用本方法的

/* 
* Created by SharpDevelop. 
* Date: 13.04.2017 
* Time: 10:29 
*/ 
using System; 
using MySql.Data.MySqlClient; 

namespace TWReporting.Database 
{ 
    public class DBConnection 
    { 
     private DBConnection() 
     { 
     } 

     private string databaseName = "**********"; 
     private string username = "**********"; 
     private string password = "**********"; 

     public string DatabaseName { 
      get { return databaseName; } 
      set { databaseName = value; } 
     } 

     public string Password { 
      get { return password; } 
      set { password = value; } 
     } 
     public string Username { 
      get { return username; } 
      set { username = value; } 
     } 

     private MySqlConnection connection = null; 
     public MySqlConnection Connection { 
      get { return connection; } 
     } 

     private static DBConnection _instance = null; 
     public static DBConnection Instance() 
     { 
      if (_instance == null) 
       _instance = new DBConnection(); 
      return _instance; 
     } 

     public bool IsConnect() 
     { 
      bool result = true; 
      if (Connection == null) { 
       if (String.IsNullOrEmpty(databaseName)) 
        result = false; 
       string connstring = string.Format("Server=localhost; database={0}; UID={1}; password={2}", databaseName, Username, Password); 
       connection = new MySqlConnection(connstring); 
       connection.Open(); 
       result = true; 
      } 
      return result; 
     } 

     public void Close() 
     { 
      connection.Close(); 
     } 
    } 
} 

實施例:

public class DataFetcher 
{ 
    public List<TestSessionDut> duts; 
    public List<TestSession> testSessions; 
    public List<TestScriptRun> testScriptRuns; 
    public List<Engine> engines; 

    public DataFetcher() 
    { 
     duts = new List<TestSessionDut>(); 
     testSessions = new List<TestSession>(); 
     testScriptRuns = new List<TestScriptRun>(); 
     engines = new List<Engine>(); 
     FetchData(); 
    } 

    public void FetchData() 
    { 
     FetchDuts(); 
     FetchEngines(); 
     FetchTestScriptRuns(); 
     FetchTestSessions(); 
    } 
    public void FetchDuts() 
     { 
      var dbCon = DBConnection.Instance(); 
      try 
      { 
       if (dbCon.IsConnect()) 
       { 
        const string query = "SELECT * FROM table"; 
        var cmd = new MySqlCommand(query, dbCon.Connection); 
        var reader = cmd.ExecuteReader(); 
        while(reader.Read()) 
        { 
         var tsd = new TestSessionDut(); 
         tsd.ID = reader.GetInt32(0); 
         tsd.Dut = reader.GetString(1); 
         this.duts.Add(tsd); 
        } 
       } 
      } 
      catch(Exception e) 
      { 
       Console.WriteLine("Fetch duts"); 
       Console.WriteLine(e.Message); 
      } 
      finally 
      { 
       dbCon.Close(); 
      } 
     } 

我請4層的方法,如這些,但所有從一個單獨的表。我可以從所有表中分別檢索數據,但是當我一起調用這些方法時,它會給出這個消息。

在此先感謝。

+0

因爲您正在使用'FetchDuts'方法關閉連接。哪一行代碼出錯? –

回答

2

IsConnect方法你正在初始化連接,如果它是空的。但下一次當您撥打IsConnect時,結果將保持爲false,因爲連接不再爲空,因此它不會進入if(connection == null)

IsConnect方法需要更改如下。

public bool IsConnect() 
{ 
    bool result = false; 

    if (connection == null) 
    { 
     //Checking if all required parameters for connection are having values. 
     if (!string.IsNullOrEmpty(databaseName) && !string.IsNullOrEmpty(Username) && !string.IsNullOrEmpty(Password)) 
     { 
      //Creating new connection. 
      string connstring = string.Format("Server=.;database={0};UID={1};password={2}", databaseName, Username, Password); 
      connection = new SqlConnection(connstring); 
     } 
    } 

    //Check if connection is not null. 
    if (connection != null) 
    { 
     //Check if current status of the connection is open. 
     //If Yes set result = true 
     if (connection.State == ConnectionState.Open) 
     { 
      result = true; 
     } 
     else 
     { 
      // If connection not already opened, open it. 
      connection.Open(); 
      result = true; 
     } 
    } 

    return result; 
} 

Close方法應該檢查連接對象,並在關閉它之前檢查它的狀態。

public void Close() 
{ 
    if (connection != null && connection.State != ConnectionState.Closed) 
    { 
     connection.Close(); 
    } 
} 
+0

好吧,我現在明白了這個問題。謝謝你的回答,這非常有幫助! – John

相關問題