我在C#中创建了一个程序,将MySql数据库结构和过程复制到新创建的数据库中。然后将新数据上传到它。它无法上传包含' @'其中的符号,例如:
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));
}
};
以下内容将新的create procedure语句上传到新数据库:
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 :(得分:1)
我通过在连接字符串中添加;Allow User Variables=True
找到答案。
Is it possible to use a MySql User Defined Variable in a .NET MySqlCommand?
答案 1 :(得分: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));
}
};