Картинна кутия към байтов масив

Имам програма за избор на изображение и за настройка на това избрано изображение в поле за картина, след което преобразувам изображението в полето за изображение в масив от байтове и запазвам база данни на sql сървър в колона тип изображение.

В събитието за щракване върху бутона за преглед избирам файла с изображение по този начин.

OpenFileDialog fop = new OpenFileDialog();
fop.InitialDirectory = @"Desktop";
fop.Filter = "image files|*.jpg;*.png;*.gif";
if (fop.ShowDialog() == DialogResult.OK)
{
     FileStream FS = new FileStream(@fop.FileName, FileMode.Open, FileAccess.Read);  
     pbPartySymbol.Image = new Bitmap(fop.FileName);
     MessageBox.Show("Image Imported Successfully!!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

След като избрах изображението и го зададох в изображението на кутията с картина, конвертирам изображението на кутията с картинка в масив от байтове в събитието за щракване на бутона за запазване и записвам масива от байтове в база данни.

public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
    MemoryStream ms = new MemoryStream();
    imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
    return ms.ToArray();
}

Наричам метода така.

byte[] myArr1 = imageToByteArray(pbPartySymbol.Image);

и предавам този байтов масив към базата данни. и също спестява. Но ВСИЧКИ добавените изображения се записват по този начин.* 0x53797374656D2E427974655B5D* Запазените изображения не могат да бъдат върнати в полето за картина при операцията за четене. Какво правя грешно в ЗАПЕСТЯВАНЕ?

Ето какво правя при запазване на операция във формуляра.

            Party ptObj = new Party(myArr1);
            if (new PartyOP().saveParty(ptObj))
            {
                MessageBox.Show("NEW data added");
            }

В моя бизнес оперативен слой това е моят код.

          public Boolean saveParty(Party ptObj)
         {
          string query1 = "EXEC insertToParty'" + ptObj.PTSymARR + "'";
           return (new DataAccessLayer().executeNonQueries(query1));
        }

Ето как съм задал свойството в класа Party.

class Party
{
    public Party() { }
    public Party(byte[] ptSym) 
    {

        this._PTSymARR = ptSym;

    }
    public byte[] PTSymARR
    {
        get { return _PTSymARR; }
        set { _PTSymARR = value; }
    }


}

ето моята съхранена процедура. СЪЗДАВАНЕ НА ПРОЦЕДУРА insertToParty ( @ptSymbol изображение ) AS BEGIN BEGIN TRANSACTION SET NOCOUNT ON; --Query INSERT INTO Party(PTSYM) VALUES (@ptSymbol);

Типът данни на PTSYM е тип данни за изображение.


person chathwind    schedule 16.10.2014    source източник
comment
Вашият код изглежда е наред, поне доколкото виждам. как се дефинира db колоната и как я четете обратно и какво се случва там?   -  person TaW    schedule 16.10.2014
comment
@TaW Имам съхранена процедура за добавяне. Просто го извиквам и подавам списъка с параметри. public Boolean saveParty(Party ptObj) { string query1 = EXEC insertToParty' + ptObj.PTSymARR + '; връщане (нов DataAccessLayer().executeNonQueries(query1)); } Тук предавам байтовия масив като свойство на обекта. Работата е там, че всички запазени изображения в DB изглеждат така 0x53797374656D2E427974655B5D   -  person chathwind    schedule 16.10.2014
comment
Изгубих се. Това е Byte[] и вие го запазвате. Какво очаквате да видите? Ако искате да го върнете към изображение по-късно, обърнете процеса.   -  person DonBoitnott    schedule 16.10.2014
comment
Какъв е типът данни на DB и каква DBMS използвате?   -  person TaW    schedule 16.10.2014
comment
@DonBoitnott Нищо за гледане. МОЛЯ, ПРОЧЕТЕТЕ › ВСИЧКИ запазени записи на изображения в DB показват този запис, 0x53797374656D2E427974655B5D. Не може да е еднакво за всички записи. Защото не запазих същото изображение.   -  person chathwind    schedule 16.10.2014
comment
@TaW. Дадено е във въпроса. SQL SERVER и тип данни за изображение.   -  person chathwind    schedule 16.10.2014
comment
Това ли е всичко, което е спестено? Заглавията на файловете трябва да са еднакви, ако файловете имат същия формат, размер..   -  person TaW    schedule 16.10.2014
comment
@TaW Да, това е всичко, което спестява.   -  person chathwind    schedule 16.10.2014
comment
Вашият въпрос, както е написан, е безполезен. Вие показвате обработка на изображения и масиви от байтове, но всъщност питате за операции за запазване/зареждане на база данни. Пренапишете го, показвайки подходящия код. Никой не може да ти помогне такъв, какъвто е.   -  person DonBoitnott    schedule 16.10.2014
comment
опитайте да зададете дебъгера на реда byte[] myArr1 = imageToByteArray(pbPartySymbol.Image); и проверете дължината на този масив!   -  person TaW    schedule 16.10.2014
comment
Каква е дължината на myArr1?   -  person TaW    schedule 16.10.2014
comment
@DonBoitnott Сега достатъчно подробно ли е?   -  person chathwind    schedule 16.10.2014
comment
@TaW Дължината на масива е 12689   -  person chathwind    schedule 16.10.2014
comment
Добре, това изглежда като правдоподобна дължина. Съжалявам, че искам „още повече подробности“, но как това се чете обратно и се преобразува в изображение? Ако всички тези байтове са в DB () дали??), проблемът изглежда е в извличането и показването му..   -  person TaW    schedule 16.10.2014
comment
@TaW да да 0x53797374656D2E427974655B5D тази стойност е в базата данни, а не на ниво формуляр. Всички записи на изображения, които получавам от SELECT * FROM Party; показва тази стойност. Как така има проблем в БД? Не трябва ли да е методът за спестяване? Затова казвам, че трябва да има проблем със спестяването. Редактирах въпроса. Моля, прегледайте го отново дали съм задал правилно стойностите за свойството във файла на класа.   -  person chathwind    schedule 16.10.2014
comment
Добре, ако тези няколко байта са всичко, което е в DB, ​​тогава наистина запазването е грешно. Опитайте решението на Stephan..   -  person TaW    schedule 16.10.2014
comment
Никога не трябва да използвате динамични низове за заявки. Опитайте се да разберете дали вашият DataAccessLayer позволява параметри.   -  person Stephan B    schedule 16.10.2014


Отговори (1)


Този шестнадесетичен низ се превежда като System.Byte[].

Добавяте байтовия масив към низа, започващ с EXEC insertToParty, така че .Net предполага, че искате низово представяне на тази променлива. Освен ако не е указано, той извиква .ToString, което ви дава .... "System.Byte[]".

Редактиране: Вашата съхранена процедура не използва шестнадесетично кодиране при вмъкване. image данните се показват в шестнадесетичен, когато се разглеждат в SQL Studio и т.н.

Ако бихте кодирали своя байтов масив в низ, използвайки base64 или шестнадесетичен, когато вмъквате и декодирате, когато четете данните, трябва да се притеснявате само за увеличеното хранилище, но ви препоръчвам да промените своя db достъп от динамичен SELECT на подготвен изявление с параметри:

SqlCommand command = new SqlCommand("Exec InsertToParty(@blob)");
command.Parameters.AddWithValue("@blob", ptObj.PTSymARR);
command.ExecuteNonQuery();
person Stephan B    schedule 16.10.2014
comment
Съхранената процедура е задължителна, няма ли все пак, че мога да редактирам това, без да премахвам съхранената процедура. - person chathwind; 16.10.2014
comment
някакви примери за код? Добавих и кода на процедурата на магазина, ако трябва да проверите. - person chathwind; 16.10.2014