none
База MSSQL и картинки RRS feed

  • Вопрос

  • Подскажите пожалуйста. Вот я создал базу данных: поля id(int) name(nvarchar(50)) и image(bit)

    Вот я так понимаю загрузить картинку в базу надо там stream использовать и т.п. А как изначально при создании базы картинку запихнуть в базу. Т.е. занести во второе поле значение можно просто с клавиатуры ввести значение и всё. А вот как через vs2010 без Management Studio ну или через MStudioExpress занести в базу сразу картинку?

    И ещё если файл на диске я в базе только ссылка, ссылка записывается в поле nvarchar? Или другое?

    Спасибо.

    1 февраля 2012 г. 13:10

Ответы

  • >  загрузить картинку в базу [...] SQL Express


    пример создания базы данных на основе EF Code First.
    загрузка изображения с диска в базу; чтение рисунка из базы и вывод в UI.  

    using System;
    using System.Data.Entity;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Windows.Forms;
    using System.Data.Common;
    
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                this.Size = new System.Drawing.Size(500, 300);
                
                CreateImage("test.bmp");     // test image
                CreateDatabase("test.bmp", true);
    
                var d = new Data();
                new PictureBox { Parent = this, Dock = DockStyle.Fill }
                    .Image = Image.FromStream(new MemoryStream(d.Pictures.First().Bytes));
            }
    
            static void CreateImage(string imgpath)
            {
                var bmp = new Bitmap(400, 200);   
                using(var g = Graphics.FromImage(bmp))
                using(var fnt = new Font("verdana", 12, FontStyle.Bold))
                {
                    g.Clear(Color.Red);
                    g.DrawString("Hello from database\n" + DateTime.Now, 
                        fnt, Brushes.White, new PointF(10, 10));
                }
                bmp.Save(imgpath);
            }
    
            static void CreateDatabase(string imgpath, bool delete)
            {
                var d = new Data();
                if(delete) 
                    d.Database.Delete();
                if (d.Database.CreateIfNotExists())
                {
                    var img = File.ReadAllBytes(imgpath);
                    var p = new Picture { Bytes = img };
                    d.Pictures.Add(p);
                    d.SaveChanges();
                }
            }
        }
    
        class Picture
        {
            public int Id { get; set; }
            public byte[] Bytes { get; set; }   // varbinary(MAX) в sql server;
        }
    
        class Data : System.Data.Entity.DbContext  // EntityFramework.dll
        {
            public DbSet<Picture> Pictures { get; set; }
            public Data() : base() { }   //  .\SQLEXPRESS
            public Data(DbConnection dc) : base(dc, true) { }
            protected override void OnModelCreating(DbModelBuilder m)
            {
                base.OnModelCreating(m);
                m.Entity<Picture>().HasKey(t => t.Id).ToTable("Pictures");
            }
        }
    }
    
     
      
    • Изменено Malobukv 1 февраля 2012 г. 19:47
    • Предложено в качестве ответа Malobukv 1 февраля 2012 г. 19:48
    • Помечено в качестве ответа developers_s 1 февраля 2012 г. 21:11
    1 февраля 2012 г. 19:47
  • В данном случае используется Entity Framework Code First. Поэтому надо скачать и добавить сборку EF 4.1 или более позднюю (текущая 4.3.1) версию, по следующей ссылке или через NuGet.
    • Предложено в качестве ответа Nik_A 25 марта 2012 г. 15:33
    • Помечено в качестве ответа Abolmasov Dmitry 26 марта 2012 г. 17:36
    25 марта 2012 г. 14:06
    Модератор
  • Тоже столкнулся с таким вопросом, нашёл код попроще предложенных ранее.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlServerCe;
    
    
    namespace Spacename
    {
        public partial class Form7 : Form
        {
            public Form7()
            {
                InitializeComponent();
                pictloader();
            }
            private void pictloader()
            {
               using( SqlCeConnection dbconnect = new SqlCeConnection(@"Data Source = databases/pictdb.sdf"))
                {
                byte[] data;
                data = System.IO.File.ReadAllBytes(@"D:\pict\13.bmp");
                SqlCeCommand cmd = new SqlCeCommand("INSERT INTO pictures (pic) VALUES (@DATA)", dbconnect);
                cmd.Parameters.AddWithValue("@DATA", data);
                dbconnect.Open();
                cmd.ExecuteNonQuery();
                dbconnect.Close();
                }
    
            }
        }
    }
    

    Код взят из видео урока, вот здесь его можно посмотреть: урок

    • Предложено в качестве ответа Nik_A 26 марта 2012 г. 15:56
    • Помечено в качестве ответа Abolmasov Dmitry 26 марта 2012 г. 17:37
    26 марта 2012 г. 15:55
    • Помечено в качестве ответа developers_s 1 февраля 2012 г. 21:11
    1 февраля 2012 г. 15:19

Все ответы

  • > как изначально при создании базы картинку запихнуть в базу.
     
     
    SQL Server или SQL Server Compact?
     
     
    1 февраля 2012 г. 13:26
  • Думал про SQL Express но буду рад и информации про CE4

     

    1 февраля 2012 г. 14:28
    • Помечено в качестве ответа developers_s 1 февраля 2012 г. 21:11
    1 февраля 2012 г. 15:19
  • >  загрузить картинку в базу [...] SQL Express


    пример создания базы данных на основе EF Code First.
    загрузка изображения с диска в базу; чтение рисунка из базы и вывод в UI.  

    using System;
    using System.Data.Entity;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Windows.Forms;
    using System.Data.Common;
    
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                this.Size = new System.Drawing.Size(500, 300);
                
                CreateImage("test.bmp");     // test image
                CreateDatabase("test.bmp", true);
    
                var d = new Data();
                new PictureBox { Parent = this, Dock = DockStyle.Fill }
                    .Image = Image.FromStream(new MemoryStream(d.Pictures.First().Bytes));
            }
    
            static void CreateImage(string imgpath)
            {
                var bmp = new Bitmap(400, 200);   
                using(var g = Graphics.FromImage(bmp))
                using(var fnt = new Font("verdana", 12, FontStyle.Bold))
                {
                    g.Clear(Color.Red);
                    g.DrawString("Hello from database\n" + DateTime.Now, 
                        fnt, Brushes.White, new PointF(10, 10));
                }
                bmp.Save(imgpath);
            }
    
            static void CreateDatabase(string imgpath, bool delete)
            {
                var d = new Data();
                if(delete) 
                    d.Database.Delete();
                if (d.Database.CreateIfNotExists())
                {
                    var img = File.ReadAllBytes(imgpath);
                    var p = new Picture { Bytes = img };
                    d.Pictures.Add(p);
                    d.SaveChanges();
                }
            }
        }
    
        class Picture
        {
            public int Id { get; set; }
            public byte[] Bytes { get; set; }   // varbinary(MAX) в sql server;
        }
    
        class Data : System.Data.Entity.DbContext  // EntityFramework.dll
        {
            public DbSet<Picture> Pictures { get; set; }
            public Data() : base() { }   //  .\SQLEXPRESS
            public Data(DbConnection dc) : base(dc, true) { }
            protected override void OnModelCreating(DbModelBuilder m)
            {
                base.OnModelCreating(m);
                m.Entity<Picture>().HasKey(t => t.Id).ToTable("Pictures");
            }
        }
    }
    
     
      
    • Изменено Malobukv 1 февраля 2012 г. 19:47
    • Предложено в качестве ответа Malobukv 1 февраля 2012 г. 19:48
    • Помечено в качестве ответа developers_s 1 февраля 2012 г. 21:11
    1 февраля 2012 г. 19:47
  • Пытался запустить ваш код, возникли некоторые ошибки. Подскажите пожалуйста в чём проблема.

       		d.Database.Delete();
                if (d.Database.CreateIfNotExists())

    Подчёркнуто Database и такая ошибка:

    ""app1.Data" не содержит определения для "Database" и не был найден метод расширения "Database", принимающий тип " app1.Data" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)"

     d.SaveChanges();

    Подчёркнуто SaveChanges, такая же ошибка.

    Ошибки: 

    Имя типа или пространства имен "DbContext" отсутствует в пространстве имен "System.Data.Entity" (пропущена ссылка на сборку?)
    Не удалось найти имя типа или пространства имен "DbSet" (пропущена директива using или ссылка на сборку?)

    Это я где-то с edmx моделью накосячил?

    25 марта 2012 г. 13:18
  • В данном случае используется Entity Framework Code First. Поэтому надо скачать и добавить сборку EF 4.1 или более позднюю (текущая 4.3.1) версию, по следующей ссылке или через NuGet.
    • Предложено в качестве ответа Nik_A 25 марта 2012 г. 15:33
    • Помечено в качестве ответа Abolmasov Dmitry 26 марта 2012 г. 17:36
    25 марта 2012 г. 14:06
    Модератор
  • У меня опять какие-то баги=)

    PM> Install-Package EntityFramework -version 4.3.1

    Install-Package : The current environment doesn't have a solution open.
    строка:1 знак:16
    + Install-Package <<<<  EntityFramework -version 4.3.1
        + CategoryInfo          : InvalidOperation: (:) [Install-Package], InvalidOperationExcep 
       tion
        + FullyQualifiedErrorId : NuGetNoActiveSolution,NuGet.PowerShell.Commands.InstallPackage 
       Command

    Не хочет ставиться =(

    25 марта 2012 г. 15:10
  • Отбой тревоги, получилось.

    Помог способ установки не через консоль: http://docs.nuget.org/docs/start-here/Managing-NuGet-Packages-Using-The-Dialog

    25 марта 2012 г. 15:13
  • Могли бы и просто EF 4.x dll скачать и поместить его в папку bin или куда нибудь ещё, вашего приложения, и указать его в References.
    25 марта 2012 г. 15:16
    Модератор
  • Ок, запомню, спасибо
    25 марта 2012 г. 15:34
  • Тоже столкнулся с таким вопросом, нашёл код попроще предложенных ранее.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlServerCe;
    
    
    namespace Spacename
    {
        public partial class Form7 : Form
        {
            public Form7()
            {
                InitializeComponent();
                pictloader();
            }
            private void pictloader()
            {
               using( SqlCeConnection dbconnect = new SqlCeConnection(@"Data Source = databases/pictdb.sdf"))
                {
                byte[] data;
                data = System.IO.File.ReadAllBytes(@"D:\pict\13.bmp");
                SqlCeCommand cmd = new SqlCeCommand("INSERT INTO pictures (pic) VALUES (@DATA)", dbconnect);
                cmd.Parameters.AddWithValue("@DATA", data);
                dbconnect.Open();
                cmd.ExecuteNonQuery();
                dbconnect.Close();
                }
    
            }
        }
    }
    

    Код взят из видео урока, вот здесь его можно посмотреть: урок

    • Предложено в качестве ответа Nik_A 26 марта 2012 г. 15:56
    • Помечено в качестве ответа Abolmasov Dmitry 26 марта 2012 г. 17:37
    26 марта 2012 г. 15:55