2012-01-13 17 views
7

Benim C# uygulamamdan yürütmek için gereken bir dosyada mysql betiğim var.C# uygulamasında * .sql mysql dosyası nasıl çalıştırılır

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 ; 

bunu saklı usul ve bazı damla diyoruz ve diğer saklı yordamlar güncelleştirmek için ifadeler oluşturun çizgilerin bir karışımı vardır görebileceğiniz gibi: İşte script ne içerdiğini gösteren bir örnektir.

Senaryoyu yürütmek için iki farklı yöntem denedim ve de başarısız olmuş:

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

Bu istisna atar: Dizin, dizi sınırlarının dışındaydı.

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

Bu, sql sözdizimimde bir hata olduğuna dair bir istisna atar.

Komut dosyasının tamamını dbForge Studio'da el ile çalıştırdığımda, tam olarak çalışır. C# app

+0

bu komut dosyası değişirse edilecek mi? Eğer öyleyse, programınızın komut satırında "mysql" komutunu parametre olarak çalıştırması en iyisidir. Aksi halde, komut dosyasındaki her adımı programınıza aktarın; Bu şekilde zincir daha az kırılgandır, yani tamamen kendi işleminize güvenirsiniz ve orada olabilecek veya olmayabilecek ya da olmayabilen bazı betikler kullanamazsınız. –

+0

maalesef mysql exe komutunu çalıştırmak için kullanamıyorum çünkü mysql server farklı bir makinede olabilir – Brian

cevap

8

Bir göz atın here. MySqlScript için bir sınırlayıcı belirtmelisiniz (oradaki prosedürü kaydettiğiniz için).

-- 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 
$$ 

Ve sonra kod: Ve sorgu gibi görünmelidir

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

Maalesef bu durum yine de istisnayı atar: Dizin, dizinin sınırları dışındaydı. – Brian

+0

DELIMITER $$ ve USE'yi (bağlantı dizginizdeki veritabanı adınız zaten var) belirtmeden deneyebilir misiniz? Değiştirilmiş cevabıma bir bakın. (Ayrıca yanlış bir sınırlayıcı kullanmıştım kod örneğim (##), şimdi düzeltildi ($$) –

+0

Ve ayrıca, örnek kodu kontrol edin: http://dev.mysql.com/doc/refman/5.5/ tr/connector-net-tutorials-mysqlscript.html # connector-net-tutorials-mysqlscript-sınırlayıcı Sadece yordam tanımını içerecek şekilde kodunuzu değiştirmeyi deneyebilirsiniz, saklı yordamlarınızın (komut dosyasının başlangıcında) çağrılması olabilir. Sorunlara neden oluyor –

1

'dan doğru şekilde yürütmek için bu komut dosyasını nasıl alabilirim? Komutu yürütmek için ayrı bir İşlemi çalıştırabilirsiniz. Örneğin:

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

Muhtemelen biraz mysql yürütülebilir veya sql komut dosyasına yolları içerecek şekilde çevreye bağlı olarak onunla uğraşmak ihtiyacımız olacak.

+2

Buradaki mySql sunucusu C# app – Brian

0

Yerel MySql sözdiziminin ne olduğundan% 100 emin değilim, ancak Sql Server için benzer işlevleri gerçekleştirdiğimizde, sql dosyasını yalnızca sorgu tarafından kullanılan literal değerlere (GO) göre parçalara ayırmamız gerekir. executor (Sql Sunucu Yönetim Konsolu).

DEFINE ifadesi gibi yukarıdaki isteğinizde bulunan benzer bilgiler olabileceğinden şüpheleniyorum.

MySql'nin şikayet ettiği şeyi tam olarak bilmek, çözümün iyileştirilmesine yardımcı olur.

+0

ile aynı makinede olmayabilir. . GO veya eşdeğeri SQL değil ve sql çözümleyicisi bunun üzerinde boğuluyor.Onları alçaltmak ya da uzun bir senaryoyu bölmek için kullanmak, biz de gidiyoruz. –

1

Nasıl bir saklı yordam içinde sql komut koyarsanız? halen kullanmakta istiyorsanız bu yolu (dosyalar .resx) uygulama kaynaklarına dosyası olarak uygulamaya sql dosyası eklemek ve bunu böyle yürütün:

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