Yazılım.
CevapSitesi.com Beta!
Çözüm Noktası
Facebook, Twitter, Google+ veya e-posta ile paylaşın.
| Sorular | Makaleler | Üyeler | Etiketler  | İletişim
Soru sormak ya da cevap vermek için;
giriş yapın veya üye olun.

Sosyal medya hesaplarınızla da giriş yapabilirsiniz.
0

Veritabanı yedeğini WinRar ile sıkıştırıp mail atmak

Merhaba arkadaşlar,

ASP.NET C#'da yapmış olduğum bir çalışmamda veritabanını Winrar ile sıkıştırıp mail atmak istiyorum, BSunu nasıl yapabilriim? Mail gönderme olayını yapıyorum ama sıkıştırma olayını yapamadım.

1 Cevap

0
1. Veritabanını yedekleme ve sıkıştırma zaman alacağından eşzamanlı olmayan programlama kullanıldı. Örnek kullanımı çalıştırın. İş Bu arada siz diğer işlemlere devam edersiniz. Arka planda ayrı bir işlem olarak çalıştırılır. Dosyanın oluşup oluşmadığını bilmeniz gerekiyorsa bu kodun içinden bunu bilemezsiniz. Başka bir yol bulmanız gerekir.

Web sitelerinde veritabanı büyüyünce işlem zaman aşımına uğrayacağından zaten bekleyemezsiniz.

2. Test edilmedi. Testini de siz yapın. Alıştırma olur.

using System.IO;
using System.IO.Compression;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Net.Mail;
using System.Net.Mime;
using System.Text;

// "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe" - E - Q "BACKUP DATABASE mydatabase TO DISK='C:\tmp\db.bak' WITH FORMAT"
// Örnek baglantı dizesi:
// "Server = veritabaniSunucusuAdresiBuraya; Database = veritabaniAdiBuraya; User Id = kullaniciAdiBuraya; Password = veritabaniKullaniciSifresiBuraya;"

// Örnek kullanım:

/*
VeritabaniYedeginiPostaylaGonder.VeritabaniYedegi.HazirlaVeGonder(
        "Server = veritabaniSunucusuAdresiBuraya; Database = veritabaniAdiBuraya; User Id = kullaniciAdiBuraya; Password = veritabaniKullaniciSifresiBuraya;",
        "veritabaniAdiBuraya",
        @"D:\GonderilenYedekler\VeritabaniAdi.bak",
        @"D:\GonderilenYedekler\VeritabaniAdi.zip",
        "Veritabanı yedeği",
        "Veritabanı yedeği ektedir",
        "yedegingonderilecegiadres@example.com"
);
*/
namespace VeritabaniYedeginiPostaylaGonder
{

    public class VeritabaniYedegi
    {
        const string GONDEREN_ADRES = "gonderenpostaadresi@gonderensiteadresiniyazin.com";
        const string GONDEREN_ADRES_SIFRESI = "sifreburaya";
        const string SMTP_CLIENT = "mail.gonderensiteadresiniyazin.com";

        public static void HazirlaVeGonder(
            string baglantiDizesi,
            string veritabaniAdi,
            string yedekDosyasiYoluVeAdi,
            string zipDosyasiYoluVeAdi,
            string konu,
            string mesaj,
            string kime)
        {
            Task.Run(async () =>
            {
                var ret = await VeritabaniYedegi.Yedekle(baglantiDizesi, veritabaniAdi, yedekDosyasiYoluVeAdi);
                if (!ret) return;
                ret = await ZipArsivi.Olustur(new string[] { yedekDosyasiYoluVeAdi }, zipDosyasiYoluVeAdi);
                if (!ret) return;
                ret = await VeritabaniYedegi.VeritabaniYedeginiPostaylaGonder(konu, mesaj, yedekDosyasiYoluVeAdi, kime);
            });
        }

        async public static Task<bool> VeritabaniYedeginiPostaylaGonder(string konu, string mesaj, string yedekDosyasiYoluVeAdi, string kime)
        {
            try
            {
                using (MailMessage Posta = new MailMessage(GONDEREN_ADRES, kime))
                {
                    Posta.Subject = konu;
                    Posta.BodyEncoding = Encoding.GetEncoding("utf-8");
                    Posta.IsBodyHtml = true;
                    Posta.Body = mesaj;


                    Attachment data = new Attachment(yedekDosyasiYoluVeAdi, MediaTypeNames.Application.Octet);
                    ContentDisposition disposition = data.ContentDisposition;
                    disposition.CreationDate = System.IO.File.GetCreationTime(yedekDosyasiYoluVeAdi);
                    disposition.ModificationDate = System.IO.File.GetLastWriteTime(yedekDosyasiYoluVeAdi);
                    disposition.ReadDate = System.IO.File.GetLastAccessTime(yedekDosyasiYoluVeAdi);
                    Posta.Attachments.Add(data);


                    using (SmtpClient Istemci = new SmtpClient(SMTP_CLIENT, 25)) {
                        Istemci.UseDefaultCredentials = false;
                        Istemci.Credentials = new System.Net.NetworkCredential(GONDEREN_ADRES, GONDEREN_ADRES_SIFRESI);
                        await Istemci.SendMailAsync(Posta);
                    }
                }
            }
            catch
            {
                return false;
            }
            return true;
        }

        async public static Task<bool> Yedekle(string baglantiDizesi, string veritabaniAdi, string yedekDosyasiYoluVeAdi)
        {
            try
            {
                if (File.Exists(yedekDosyasiYoluVeAdi)) File.Delete(yedekDosyasiYoluVeAdi);
                using (SqlConnection baglanti = new SqlConnection(baglantiDizesi))
                {
                    baglanti.Open();
                    using (SqlCommand cmd = new SqlCommand())
                    {
                        cmd.Connection = baglanti;
                        cmd.CommandText = "BACKUP DATABASE " + veritabaniAdi + " TO DISK='" + yedekDosyasiYoluVeAdi + "'";
                        await cmd.ExecuteNonQueryAsync();
                    }
                }
            }
            catch
            {
                return false;
            }
            return true;
        }
    }

    public class ZipArsivi
    {
        async public static Task<bool> Olustur(string[] dosyalar, string zipDosyasiYoluVeAdi, CompressionLevel seviye = CompressionLevel.Optimal)
        {
            var val = await Task.Run(() =>
            {
                if (File.Exists(zipDosyasiYoluVeAdi)) File.Delete(zipDosyasiYoluVeAdi);
                try
                {
                    using (ZipArchive zip = ZipFile.Open(zipDosyasiYoluVeAdi, ZipArchiveMode.Create))
                    {
                        // Array.ForEach(dosyalar, dosya => zip.CreateEntryFromFile(dosya, Path.GetFileName(dosya), seviye));
                        foreach (string dosya in dosyalar)
                        {
                            zip.CreateEntryFromFile(dosya, Path.GetFileName(dosya), seviye);
                        }
                    }
                }
                catch
                {
                    return false;
                }
                return true;
            });
            return val;
        }
    }

}




Cevaplayan: 27.05.21 21:42
cevapsitesi
101,974p 15ü