Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过C将create procedure命令上载到mysql时忽略@symbol#_C#_Mysql_Mysql.data - Fatal编程技术网

C# 通过C将create procedure命令上载到mysql时忽略@symbol#

C# 通过C将create procedure命令上载到mysql时忽略@symbol#,c#,mysql,mysql.data,C#,Mysql,Mysql.data,我用C#创建了一个程序,将MySql数据库结构和过程复制到新创建的数据库中。然后将新数据上传到它。问题是无法上载包含“@”符号的过程,例如: SET @SEARCH := CONCAT( _SEARCH , '%'); 我用于检索过程的代码是: cmd = new MySqlCommand("SELECT CONCAT( 'CREATE PROCEDURE ', ISR.ROUTINE_NAME, '(', CASE WHEN ISP.PARAMETER_NAME IS NOT NULL TH

我用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忽略@符号呢?

如何使用参数,如下所示:

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));
               }
        };

我通过添加
找到了答案;允许将用户变量=True
添加到连接字符串


尽管我通常是参数的支持者,但这段代码中没有任何问题。如果我是该输入的唯一提供者,并且该输入本身是一个数据库名称,那么在该查询中不应该导致任何错误,那么在本例中它们是不必要的。