Поле изображения в байтовый массив

У меня есть программа для выбора изображения и установки этого выбранного изображения в поле изображения, затем преобразование изображения в поле изображения в массив байтов и сохранение базы данных сервера 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; - Запрос INSERT INTO Party (PTSYM) VALUES (@ptSymbol);

Тип данных PTSYM - это тип данных изображения.


person chathwind    schedule 16.10.2014    source источник
comment
Кажется, ваш код в порядке, по крайней мере, насколько я могу судить. как определяется столбец db и как вы его читаете, и что там происходит?   -  person TaW    schedule 16.10.2014
comment
@TaW У меня есть хранимая процедура, которую нужно добавить. Я просто вызываю его и передаю список параметров. общедоступное логическое значение saveParty (Party ptObj) {строка query1 = EXEC insertToParty '+ ptObj.PTSymARR +'; возврат (новый DataAccessLayer (). executeNonQueries (query1)); } Здесь я передаю байтовый массив как свойство объекта. Дело в том, что все сохраненные изображения в БД выглядят так: 0x53797374656D2E427974655B5D   -  person chathwind    schedule 16.10.2014
comment
Я потерялся. Это Byte[], и вы его сохраняете. Что вы ожидаете увидеть? Если вы хотите вернуться к изображению позже, повторите процесс в обратном порядке.   -  person DonBoitnott    schedule 16.10.2014
comment
Что такое тип данных БД и какую СУБД вы используете?   -  person TaW    schedule 16.10.2014
comment
@DonBoitnott Ничего не видно. ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ ›ВСЕ сохраненные записи изображений в БД показывают эту запись, 0x53797374656D2E427974655B5D. Это не может быть одинаковым для всех записей. Потому что я не сохранил то же изображение.   -  person chathwind    schedule 16.10.2014
comment
@TaW. Это указано в вопросе. SQL SERVER и тип данных Image.   -  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
Хорошо, это похоже на правдоподобную длину. Извините, что запрашиваю «еще больше деталей», но как это прочитать и преобразовать в изображение? Если все эти байты находятся в БД (), не так ли ??), проблема, похоже, заключается в их извлечении и отображении ..   -  person TaW    schedule 16.10.2014
comment
@TaW да да 0x53797374656D2E427974655B5D это значение находится в базе данных, а не на уровне формы. Все записи изображений я получаю от SELECT * FROM Party; показывает это значение. Почему проблема в БД? Разве это не метод экономии? Вот почему я говорю, что с сохранением должна быть проблема. Редактировал вопрос. Просмотрите еще раз, правильно ли я установил значения свойства в файле класса.   -  person chathwind    schedule 16.10.2014
comment
Хорошо, если эти несколько байтов - все, что есть в БД, тогда действительно сохранение неверно. Попробуйте решение Стефана ..   -  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 или hex при вставке и декодировании, когда вы читаете данные, вам нужно было только беспокоиться об увеличенном хранилище, но я рекомендую вам изменить доступ к базе данных с динамического 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