2011-07-28 26 views
2

工作每個其他呼叫我工作的公司有一個即將推出的項目,將使用MySQL作爲C#ASP .Net前端的後端。我把一個測試應用程序和數據庫放在一起,除非我嘗試調用任何proc,它會在第一次調用時工作,而不是下一次,然後再次,然後不是,它只能用於其他任何嘗試。MySQL存儲特效通過.Net

使用工作臺每次調用proc工程,就像使用VS2010連接到數據庫一樣,它只是失敗的應用程序代碼。我一直很確定每次都確保連接打開和關閉(並且處理完畢),但沒有運氣。

這裏是一個示例查詢;這是我一直在使用的proc:

SELECT 
     U.id, 
     U.First_Name, 
     U.Last_Name, 
     U.Birth_Date, 
     U.Created, 
     U.Password 
    FROM 
     test.user U; 

正如你所看到的,它非常簡單。然而,這不僅僅是那個過程。我可以按任何順序調用任何procs並獲得相同的結果;關閉,打開,關閉等。如果我在代碼中調用不使用proc的查詢,它可以正常工作,但是公司使用的模型可以處理每個對數據庫(MSSQL)的調用,並且他們想要攜帶與此應用程序相同的標準也是如此。

只是要徹底,這裏是連接字符串(值修改當然):

Server=127.0.0.1;Port=3306;Data Source=localhost;Database=testdb;User Id=test_user;Password=pword; 

而下面是在數據庫管理器的頂部:

​​

我運行連接,命令和數據適配器都帶有「使用」塊,以確保它們在執行後被正確處理而沒有鬆散的末端,並且甚至試圖在關閉之後專門聲明它們的處置纔是安全的。沒有什麼改變行爲。

有沒有人見過這個?一切都在當地運行,以防萬一。

下面是使調用的代碼,我可能已經解決了它自己:

公共靜態數據表SPExecuteTable(字符串的CommandText = 「」,列出第= NULL) { DataTable的DT =新的DataTable( ); 異常ex = null;

using (MySqlConnection conn = new MySqlConnection(MySQL_Connection)) 
    { 
     using (MySqlCommand com = MySQlComnd(commandText, paras)) 
     { 
      try 
      { 
       conn.Open(); 
       com.Connection = conn; 

       using (MySqlDataAdapter oda = new MySqlDataAdapter()) 
       { 
        oda.SelectCommand = com; 
        oda.Fill(dt); 

       } 
      } 
      catch (Exception e) 
      { 
       ex = e; 
      } 
      finally 
      { 
       conn.Close(); 
      } 
     } 
    } 

    if (ex != null) 
     throw ex; 

    return dt; 
} 
+2

顯示您的實際呼叫代碼... –

回答

1

我有點啞運氣到一個解決方案:

public static DataTable SPExecuteTable(string commandText = "", List<object> paras = null) 
    { 
     DataSet ds = new DataSet(); 
     DataTable dt = new DataTable(); 
     Exception ex = null; 

      using (MySqlCommand com = MySQlComnd(commandText, paras)) 
      { 
       try 
       { 
        com.Connection.Open(); 

        using (MySqlDataAdapter oda = new MySqlDataAdapter()) 
        { 
         oda.SelectCommand = com; 
         oda.Fill(ds); 
         dt = ds.Tables[0]; 
        } 
       } 
       catch (Exception e) 
       { 
        ex = e; 
       } 
       finally 
       { 
        com.Connection.Close(); 
        com.Connection.Dispose(); 
       } 
      } 


     if (ex != null) 
      throw ex; 

     return dt; 
    } 

正如你可以看到,如果你填充DataSet,然後就搶了先表,它的工作原理。我假設MySQL數據適配器只填充一個表存在一些根本問題,但DataSet似乎不會共享該問題。

+0

您爲我節省了很多挫折....我無法弄清楚爲什麼每個其他調用數據庫都沒有返回任何內容或給我一個大的錯誤,如_「過程或函數___不存在於數據庫_____「_」中。當MySQL數據適配器只填充一個表格時,所有的數據適配器都會搞砸,而不是填充數據集。在我的情況下,我使用自動生成的數據集代碼,所以我必須重載Fill()方法以允許填充數據集而不是表格。似乎現在通過工作! – Aaronster