2014-04-03 24 views
1

我在C#中創建了一個程序,用於將MySql數據庫結構和過程複製到新創建的數據庫。然後將新數據上傳到它。失敗的問題上傳程序,包括其中的「@」符號,例如:通過C#將創建過程命令上傳到mysql時忽略@symbol

SET @SEARCH := CONCAT(_SEARCH , '%'); 

我用檢索程序的代碼是:

cmd = new MySqlCommand("SELECT CONCAT('CREATE PROCEDURE ', ISR.ROUTINE_NAME, '(', CASE WHEN ISP.PARAMETER_NAME IS NOT NULL THEN GROUP_CONCAT(CONCAT(ISP.PARAMETER_MODE, ' ', ISP.PARAMETER_NAME, ' ', ISP.DTD_IDENTIFIER)) ELSE '' END, ')\n', ISR.ROUTINE_DEFINITION) AS Create_Procedure FROM INFORMATION_SCHEMA.ROUTINES ISR LEFT JOIN INFORMATION_SCHEMA.PARAMETERS ISP ON ISR.ROUTINE_SCHEMA = ISP.SPECIFIC_SCHEMA AND ISR.ROUTINE_NAME = ISP.SPECIFIC_NAME AND ISR.ROUTINE_TYPE = ISP.ROUTINE_TYPE WHERE ROUTINE_SCHEMA = '" + Program.RemoteSource + "' GROUP BY ISR.ROUTINE_NAME;", remote); 
using (MySqlDataReader dataReader = cmd.ExecuteReader()) 
    { 
     while (dataReader.Read()) 
      { 
      createProcedures.Add(dataReader.GetString(0)); 
      } 
    }; 

及以下上傳新創建過程語句到新的數據庫:

counter = 0; 
foreach (string procedure in createProcedures) 
    { 
    try 
     { 
      cmd = new MySqlCommand(@procedure, remote); 
      cmd.ExecuteNonQuery(); 
      counter++; 
      Console.Write("\rProcedures Created: " + counter + " of " + createProcedures.Count); 
     } 
    catch (MySqlException ex) 
     { 
      Console.WriteLine("Error: {0}", ex.ToString()); 
     } 
    } 

和錯誤:

Error: MySql.Data.MySqlClient.MySqlException (0x800040005): 
Fatal error encountered during command execution. ---> 
MySql.Data.MySqlClient.MySqlException (0x800040005): 
    Parameter '@SEARCH' must be defined. 

我將如何去讓MySql.Data忽略@符號?

回答

0

怎麼樣使用的參數,如:

cmd = new MySqlCommand("SELECT CONCAT('CREATE PROCEDURE ', ISR.ROUTINE_NAME, '(', CASE WHEN ISP.PARAMETER_NAME IS NOT NULL THEN GROUP_CONCAT(CONCAT(ISP.PARAMETER_MODE, ' ',ISP.PARAMETER_NAME, ' ', ISP.DTD_IDENTIFIER)) ELSE '' END, ')\n', ISR.ROUTINE_DEFINITION) AS Create_Procedure FROM INFORMATION_SCHEMA.ROUTINES ISR LEFT JOIN INFORMATION_SCHEMA.PARAMETERS ISP ON ISR.ROUTINE_SCHEMA = ISP.SPECIFIC_SCHEMA AND ISR.ROUTINE_NAME = ISP.SPECIFIC_NAME AND ISR.ROUTINE_TYPE = ISP.ROUTINE_TYPE WHERE ROUTINE_SCHEMA = @routine_schema GROUP BY ISR.ROUTINE_NAME;", remote); 
cmd.Parameters.AddWithValue("@routine_schema", Program.RemoteSource); 
    using (MySqlDataReader dataReader = cmd.ExecuteReader()) 
     { 
      while (dataReader.Read()) 
       { 
       createProcedures.Add(dataReader.GetString(0)); 
       } 
     }; 
+0

雖然我通常是參數的支持者,但在代碼片段中沒有問題。在這種情況下,他們不是必需的,我將是該輸入的唯一提供者,並且輸入本身是數據庫名稱,因此它不應在該查詢中引起任何錯誤。 – varubi

+0

好的。我不確定「@」是什麼問題。 – attila