简体   繁体   English

如何在我的 c# 应用程序中执行 *.sql mysql 文件

[英]How to execute *.sql mysql file in my c# application

I have a mysql script in a file that I need to be able to execute from my c# application.我在一个文件中有一个 mysql 脚本,我需要能够从我的 c# 应用程序中执行它。 Here is a sample of what the script contains:以下是该脚本所包含内容的示例:

USE osae;

-- Set DB version 
CALL osae_sp_object_property_set('SYSTEM', 'DB Version', '0.3.5', '', '');
CALL osae_sp_object_property_set('SYSTEM', 'Debug', 'FALSE', '', '');
CALL osae_sp_object_type_property_add ('Prune Logs','Boolean','TRUE','SYSTEM',0);
CALL osae_sp_object_property_set ('SYSTEM','Prune Logs','TRUE','','');

DELIMITER $$

DROP PROCEDURE IF EXISTS osae_sp_object_event_script_update$$
CREATE DEFINER = 'root'@'localhost'
PROCEDURE osae_sp_object_event_script_update(IN pobject varchar(200), IN pevent varchar(200), IN ptext text)
BEGIN
DECLARE vObjectCount INT;
DECLARE vObjectID INT;
DECLARE vObjectTypeID INT;
DECLARE vEventCount INT;
DECLARE vEventID INT;
    SELECT COUNT(object_id) INTO vObjectCount FROM osae_object WHERE UPPER(object_name)=UPPER(pobject);
    IF vObjectCount > 0 THEN
              SELECT object_id,object_type_id INTO vObjectID,vObjectTypeID FROM osae_object WHERE UPPER(object_name)=UPPER(pobject);
        SELECT COUNT(event_id) INTO vEventCount FROM osae_object_type_event WHERE object_type_id=vObjectTypeID AND (UPPER(event_name)=UPPER(pevent) OR UPPER(event_label)=UPPER(pevent));
        IF vEventCount = 1 THEN     
            SELECT event_id INTO vEventID FROM osae_object_type_event WHERE object_type_id=vObjectTypeID AND (UPPER(event_name)=UPPER(pevent) OR UPPER(event_label)=UPPER(pevent));
            UPDATE osae_object_event_script SET event_script=ptext WHERE object_id=vObjectID AND event_id=vEventID;
         -- CALL osae_sp_debug_log_add(CONCAT('Updated ',vObjectID,' - ',vEventID,ptext),'');  
        END IF;
    END IF; 
END
$$

DELIMITER ;

As you can see it has a mixture of lines that call stored procedures and some drop and create statements to update other stored procedures.正如您所看到的,它混合了调用存储过程的行和一些用于更新其他存储过程的 drop 和 create 语句。

I have tried two different methods to execute the script and both have failed:我尝试了两种不同的方法来执行脚本,但都失败了:

MySqlScript script = new MySqlScript(connection, File.ReadAllText("script.sql"));
script.Execute();

This throws the exception: Index was outside the bounds of the array.这会引发异常:索引超出了数组的范围。

MySqlCommand upgCommand = new MySqlCommand();
upgCommand.Connection = connection;
upgCommand.CommandText = File.ReadAllText("script.sql");
upgCommand.ExecuteNonQuery();

This throws an exception that there is an error in my sql syntax.这会引发异常,说明我的 sql 语法有错误。

When I run the entire script manually in dbForge Studio it executes perfectly.当我在 dbForge Studio 中手动运行整个脚本时,它完美地执行。 How can I get this script to execute correctly from my C# app我怎样才能让这个脚本从我的 C# 应用程序中正确执行

Take a look here .看看这里 You should specify a delimiter for MySqlScript (since you have stored procedure in there).您应该为 MySqlScript 指定一个分隔符(因为您在那里有存储过程)。 And your query should look like:您的查询应如下所示:

-- Set DB version 
CALL osae_sp_object_property_set('SYSTEM', 'DB Version', '0.3.5', '', '')$$
CALL osae_sp_object_property_set('SYSTEM', 'Debug', 'FALSE', '', '')$$
CALL osae_sp_object_type_property_add ('Prune Logs','Boolean','TRUE','SYSTEM',0)$$
CALL osae_sp_object_property_set ('SYSTEM','Prune Logs','TRUE','','')$$



DROP PROCEDURE IF EXISTS osae_sp_object_event_script_update$$
CREATE DEFINER = 'root'@'localhost'
PROCEDURE osae_sp_object_event_script_update(IN pobject varchar(200), IN pevent varchar(200), IN ptext text)
BEGIN
DECLARE vObjectCount INT;
DECLARE vObjectID INT;
DECLARE vObjectTypeID INT;
DECLARE vEventCount INT;
DECLARE vEventID INT;
    SELECT COUNT(object_id) INTO vObjectCount FROM osae_object WHERE UPPER(object_name)=UPPER(pobject);
    IF vObjectCount > 0 THEN
              SELECT object_id,object_type_id INTO vObjectID,vObjectTypeID FROM osae_object WHERE UPPER(object_name)=UPPER(pobject);
        SELECT COUNT(event_id) INTO vEventCount FROM osae_object_type_event WHERE object_type_id=vObjectTypeID AND (UPPER(event_name)=UPPER(pevent) OR UPPER(event_label)=UPPER(pevent));
        IF vEventCount = 1 THEN     
            SELECT event_id INTO vEventID FROM osae_object_type_event WHERE object_type_id=vObjectTypeID AND (UPPER(event_name)=UPPER(pevent) OR UPPER(event_label)=UPPER(pevent));
            UPDATE osae_object_event_script SET event_script=ptext WHERE object_id=vObjectID AND event_id=vEventID;
         -- CALL osae_sp_debug_log_add(CONCAT('Updated ',vObjectID,' - ',vEventID,ptext),'');  
        END IF;
    END IF; 
END
$$

And then your code:然后你的代码:

MySqlScript script = new MySqlScript(connection, File.ReadAllText("script.sql"));
script.Delimiter = "$$";
script.Execute();

You could run a separate Process to execute the script.您可以运行一个单独的进程来执行脚本。 For example:例如:

Process.Start("mysql < script.sql");

You are probably going to need to play around with it a little depending on your environment to include paths to the mysql executable or the sql script.根据您的环境,您可能需要稍微尝试一下,以包含 mysql 可执行文件或 sql 脚本的路径。

How if you put your sql script in a stored procedure?如果将 sql 脚本放在存储过程中会怎样? If you still want use this way attach the sql file to application as file to the application resources (files .resx) and execute it like that:如果您仍然想使用这种方式将 sql 文件附加到应用程序作为文件到应用程序资源(文件 .resx)并像这样执行它:

MySql.Data.MySqlClient.MySqlCommand cmdMySQL = newMySqlConnection.CreateCommand();
cmdMySQL.CommandText = (System.String)globalResource.your_file_name;

I am not 100% sure what native MySql syntax is, but when we perform similar functionality for Sql Server, we have to break the sql file into chunks based on the literal values ( GO ) that are only used by the query executor (Sql Server Management Console).我不是 100% 确定本地 MySql 语法是什么,但是当我们为 Sql Server 执行类似的功能时,我们必须根据仅由查询执行器(Sql Server)使用的文字值( GO )将 sql 文件分成块管理控制台)。

I suspect there may be similar information embedded in your request above, such as the DEFINE statement.我怀疑上面的请求中可能嵌入了类似的信息,例如 DEFINE 语句。

Knowing exactly what MySql complained about would help refine the solution.准确了解 MySql 抱怨的内容将有助于完善解决方案。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM