Tag Archives: sql

Как да извлечем картинките от базата данни Northwind с помощта на C#, ADO.NET и SQL Server 2008 R2?

Какво представлява Northwind?

nortwind traders database logoБазата данни Northwind съдържа данните за продажбите на имагинерна фирма, която внася и изнася храни по целия свят. Тя е била създадена от Microsoft като проста база, която да се използва с техните продукти – Access и SQL Server. Известна е с това, че е построена много добре и е перфектна за учебни цели. Във w3schools например, сайт с онлайн туториали, базата на Northwind Traders се използва в SQL примерите. Можете да изтеглите скрипта на Northwind за SQL Server 2008 R2 от тук.

Какво е OLE?

През 1990 екипът в Microsoft, който разработва Access се нуждаел от начин не само да съхранява данни, но и да я предоставя на потребител, който е качил и друг софтуер на компютъра си. Тогава е нямало надежден начин да откриеш чрез операционната система кой софтуер с какви типове файлове работи. На тях им дошла идея, която била наречена Object Linking and Embedding(OLE).

Как се съхраняват файлове с OLE структура?

OLE структурата представлява следното:

  1. Пакетен header
  2. Ole header
  3. Datablock header
  4. Данни
  5. Metafilepict блок
  6. Ole footer

Когато се работи с картинки, има блок, който се нарича metafilepict. Едва ли ще откриете картинка, ако го прочетете. Стартовата позиция на картинката се изчислява след като се изпусне този блок.
Metafilepict стартова позиция = дължината на package header-а + дължината на ole header-а + 8 празни байта + 4 байта, указващи дължината на данните + дължината на байтовете + 45 (дължината на metafilepict header-а). При картинките в Northwind това число е точно 78.

Четене на images от таблица Categories в Northwind

След като вече знаем, че трябва да прескочим 78 байта, за да прочетем картинката, просто трябва да го напишем. Използвам код на C# и доста остарялата технология ADO.NET, но тя ще свърши перфектна работа за простия пример.
Кодът на C#:

int OLE_METAFILEPICT_START_POSITION = 78;

SqlConnection con = new SqlConnection(
    "Server=.\\SQLEXPRESS; " +
    "Database=Northwind; " +
    "Integrated Security=true");
con.Open();
using (con)
{
    SqlCommand command = new SqlCommand(
        "SELECT CategoryName, Picture " +
        "FROM Categories", con);
    SqlDataReader reader = command.ExecuteReader();
                
    using (reader)
    {
        while (reader.Read())
        {
            string categoryName = ((string)reader["CategoryName"]);
            if (categoryName.Contains('/') == true)
            {
                categoryName = categoryName.Replace('/', ' ');
            }
            byte[] pictureBytes = reader["Picture"] as byte[];
                        
            MemoryStream stream = new MemoryStream(
                pictureBytes, OLE_METAFILEPICT_START_POSITION,
                pictureBytes.Length - OLE_METAFILEPICT_START_POSITION);	
						
            Image image = Image.FromStream(stream);
            using (image)
            {
                image.Save(categoryName + ".jpg", ImageFormat.Jpeg);
            }
        }                    
    }                
}

Картинките:
northwind images from categories table

Въведение в NoSQL

Какво е NoSQL?

nosqlNoSQL е система за управление на нерелационни бази от данни. Тези системи имат значителни разлики със същите, управляващи релационни бази. Те са измислени за ползване на разпределени хранилища за данни, където е нужна мащабируемост (например Google или Facebook, които събират терабитове данни всеки ден). Това съхраняване на данни може да не се нуждае от определена схема, да избягва join операции и по приницп да скалира хоризонтално.

История на NoSQL

Терминът NoSQL е въведен от Карло Строци през 1998 година. Той го използва, за да наименува неговата open-source лека база от данни, която няма SQL интерфейс. В началото на 2009 година, когато last.fm организира събитие за open-source разпределени бази от данни, Ерик Еванс, работник на Rackspace, преизползва термина, отнасяйки го към бази от данни, които са нерелационни, разпределени и не поддържат ACID (atomicity, consistency, isolation, durability) – четири от характеристиките на традиционните системи за управление на релационни бази от данни.
През същата година в Атланта, САЩ, се състои конференцията “no:sql(east)”, където NoSQL била обсъждана много. След това дискусията и практиката на NoSQL придобила несравним растеж.

Важни характеристики на NoSQL

nosql types of databases
Без схема : Схема на база от данни е структурата на системата, описана във формален език, който се поддържа от системата за управление на базата. В релационната база от данни схемата дефинира таблиците, полетата им и връзките между тях. В NoSQL колекцията е група от документи, всеки от които представлява ред, а колекцията прилича на таблицита от релационните бази от данни. Колекциите няма схема, което означава, че в една колекция могат да се съдържат различни по тип и структура документи. Например, следните два документа могат да бъдат запазени в една единствена колекция:
{“animal” : “monkey”}
{“speed” : 280.00}
Забележете, че горните два документа нямат нищо общo между елементите. Тази гъвкавост означава, че могат да се прилагат всякакви схема върху база данни от тип NoSQL.
Хоризонтална мащабируемост: Да се мащабира хоризонтално означава да се добавят още възли към системата (например добавяне на нов компютър). В NoSQL запазването на данни може да бъде много по-бързо, понеже то взима предимството на хоризонталното мащабиране и разпределя данните между възлите.

Категории на NoSQL бази от данни

КатегорияОписаниеБази
Документ базираниДанните се пазят като документи. Примерен формат би бил нещо такова:
FirstName="Tihomir", Address="Beroe Square", Spouse=[{Name:"Penka"}], Children=[{Name:"Gosho", Age:18}]
CouchDB, MongoDB, OrientDB, SimpleDB и други
XML базираниДанните се пазят в XML формат.BaseX, eXist и други
ГрафовиДанните се съхраняват като колекция от възли, където възлите са аналог на обекти в съвременен език за програмиране. Възлите са свързани чрез връзки.AllegroGraph, DEX, Neo4j, FlockDB, GraphDB и други
Ключ-стойност базираниВ категориите, базирани на ключ-стойност, потребителят може да съхранява данни без схема. Ключовете могат да са стрингове, хеш-стойности, листове, множества, сортирани множества и др.Cassandra, Redis, memcached и други

Кой използва NoSQL?

Следните големи компании използват NoSQL бази от данни: