Tôi có tập lệnh mysql trong một tệp mà tôi cần để có thể thực thi từ ứng dụng C# của tôi. Dưới đây là ví dụ về những gì tập lệnh chứa:Cách thực thi tệp * .sql mysql trong ứng dụng C#
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 ;
Như bạn có thể thấy nó có một hỗn hợp các dòng gọi thủ tục lưu trữ và một số lệnh thả và tạo để cập nhật các thủ tục được lưu trữ khác.
Tôi đã thử hai phương pháp khác nhau để thực thi kịch bản và cả hai đã thất bại:
MySqlScript script = new MySqlScript(connection, File.ReadAllText("script.sql"));
script.Execute();
này ném ngoại lệ: Index lại vượt ra ngoài giới hạn của mảng.
MySqlCommand upgCommand = new MySqlCommand();
upgCommand.Connection = connection;
upgCommand.CommandText = File.ReadAllText("script.sql");
upgCommand.ExecuteNonQuery();
Điều này ném ngoại lệ là có lỗi trong cú pháp sql của tôi.
Khi tôi chạy toàn bộ tập lệnh theo cách thủ công trong dbForge Studio, nó thực thi hoàn hảo. Làm thế nào tôi có thể nhận được tập lệnh này để thực thi chính xác từ ứng dụng C#
Tập lệnh này có thay đổi không? Nếu vậy, có lẽ tốt nhất là bạn nên chạy chương trình 'mysql' ở dòng lệnh với kịch bản làm tham số. Nếu không, hãy tiêu thụ từng bước trong tập lệnh vào chương trình của bạn; theo cách đó, chuỗi ít giòn hơn, tức là bạn sẽ hoàn toàn dựa vào quy trình của riêng bạn chứ không phải một số tập lệnh có thể có hoặc không có ở đó và có thể có hoặc không hoạt động. –
tiếc là tôi không thể sử dụng exe mysql để thực thi kịch bản vì máy chủ mysql có thể nằm trên một máy khác nhau – Brian