Goran Bibic Ответов: 2

Вставить PDF файл в базу данных C#


Вставить PDF в базу данных

Это хороший способ?

Что я уже пробовал:

private void Button2_Click(object sender, EventArgs e)   //Save pdf in database
        {
            byte[] filedata = null;
            MemoryStream ms = new MemoryStream();
            filedata = ms.GetBuffer();
            axAcroPDF1.src = LocalEncoding.GetString(ms.ToArray());



                    using (SqlConnection openCon = new SqlConnection(cs))
                    {

                        string saveStaff = "declare @maxNo integer = 0 select @maxNo = isnull(max(number), 0) from [dbo].[documents]; Set @maxNo=@maxNo+1; INSERT into dbo.documents (number,file_location, pdf_file) VALUES (@maxNo,@file_location,@pdf_file)";

                        using (SqlCommand querySaveStaff = new SqlCommand(saveStaff))
                        {
                            querySaveStaff.Connection = openCon;

                            querySaveStaff.Parameters.Add("@file_location", SqlDbType.VarChar, 255).Value = file_locationTextBox.Text;

                            querySaveStaff.Parameters.AddWithValue("@pdf_file", SqlDbType.VarBinary).Value = filedata;

                            openCon.Open();
                            querySaveStaff.ExecuteNonQuery();
                            openCon.Close();                            


                        }

                    }

}

Richard MacCutchan

У вас есть вопрос?

Goran Bibic

Да. Это вопрос. Почему в БД пишут только 0x

Когда ставится картинка есть 0xFFD8FFE000104A46494600010101000000000000ffe2021c4943435f50524f........

И я могу читать из файла БД

Хорошо?

Patrice T

- Это хороший способ?
Это работает ?

Goran Bibic

Да. Это вопрос. Почему в БД пишут только 0x

Когда ставится картинка есть 0xFFD8FFE000104A46494600010101000000000000ffe2021c4943435f50524f........

И я могу читать из файла БД

Хорошо?

2 Ответов

Рейтинг:
2

Pete O'Hanlon

Хотя фактическое хранение массива байтов PDF является примерно правильным, у вас есть фундаментальная проблема в создании идентификатора. Вместо того чтобы вручную добавлять идентификатор самостоятельно, подумайте о том, чтобы изменить это поле на автоинкремент, и пусть это позаботится само о себе. Таким образом, вы рискуете, что два поля попытаются добавить один и тот же идентификатор в многопользовательской системе, потому что нет никакой гарантии, что вы завершите последовательность вставки до начала следующего.


Рейтинг:
2

Richard MacCutchan

Что должен делать этот код?

            byte[] filedata = null;   // filedata contains nothing
            MemoryStream ms = new MemoryStream(); // a new empty memory stream
            filedata = ms.GetBuffer();  // filedata still contains nothing
            axAcroPDF1.src = LocalEncoding.GetString(ms.ToArray()); // no idea what this is supposed to do

// ...

querySaveStaff.Parameters.AddWithValue("@pdf_file", SqlDbType.VarBinary).Value = filedata;
// but you never add any content to filedata, so it adds 0x0 to the database.


Goran Bibic

Какая-то помощь?

Richard MacCutchan

Некоторая помощь: вам просто нужно прочитать содержимое файла в массив filedata. Простая операция с использованием streamreader.

Goran Bibic

Я решаю эту проблему и работаю...просто нужна помощь для извлечения из БД.

Сохранить вот так

частный недействительными методе button2_click(объект отправителя, EventArgs в е) //сохранение //сними
{
Диалоговое окно openfiledialog ОФД = новое диалоговое окно openfiledialog() { фильтр = "формат PDF|*.формат PDF" };//открыть файл PDF
if (ofd.ShowDialog() == DialogResult.ОК)
{

FileStream fs = файл.OpenRead(ofd.FileName);
MemoryStream ms = Новый Поток памяти();
axAcroPDF1.src = локальное кодирование.GetString(ms.Метод toArray());
ПС.Метод CopyTo(МС);

если (count_numberTextBox.Включено == правда)
{
если (строка.IsNullOrEmpty(idTextBox.Text))
{

using (SqlConnection openCon = new SqlConnection(cs))
{

строки saveStaff = "объявить @maxNo целое число = 0 выберите @maxNo = функция isnull(Max(число), 0) От на [dbo].[документы]; установить @maxNo=@maxNo+1; вставить в dbo.documents (number, count_number, label, partner, tax_number, date, file_location, pdf_file) значения (@maxNo,@count_number,@label,@partner,@tax_number,@date,@file_location,@pdf_file)";

используя (sqlcommand, который querySaveStaff = новая команда sqlcommand(saveStaff))
{
querySaveStaff.Соединение = openCon;
querySaveStaff.Parameters.Add("@count_number", SqlDbType.VarChar, 255).Value = count_numberTextBox.Text;
querySaveStaff.Parameters.Add("@label", SqlDbType.VarChar, 255).Value = labelTextBox.Text;
querySaveStaff.Parameters.Add("@partner", SqlDbType.VarChar, 255).Value = partnerComboBox.Текст;
querySaveStaff.Parameters.Add("@tax_number", SqlDbType.VarChar, 255).Value = tax_numberTextBox.Text;
querySaveStaff.Parameters.Add("@date", SqlDbType.Date).Value = dateDateTimePicker.Текст;
querySaveStaff.Parameters.Add("@file_location", SqlDbType.VarChar, 255).Value = file_locationTextBox.Text;
querySaveStaff.Parameters.AddWithValue ("@pdf_file", SqlDbType.VarBinary).Значение = МС.Метод toArray();

openCon.Открыть();
querySaveStaff.Метод executenonquery();
openCon.Закрывать();

dateDateTimePicker.Включен = ложь;
count_numberTextBox.Включен = ложь;
file_locationTextBox.Включен = ложь;
labelTextBox.Включен = ложь;
partnerComboBox.Включен = ложь;
tax_numberTextBox.Включен = ложь;
кнопки button3.Включен = ложь;
button4.Включен = ложь;


}

}
}
еще
{

using (SqlConnection openCon = new SqlConnection(cs))
{
строки saveStaff = "ДБО обновление.комплект документов count_number=@count_number, ярлык=@ярлык, партнер=@партнером, tax_number=@tax_number, дата=@дата, file_location=@file_location, pdf_file=@pdf_file где ID= " + idTextBox.Текст;

используя (sqlcommand, который querySaveStaff = новая команда sqlcommand(saveStaff))
{

querySaveStaff.Соединение = openCon;
querySaveStaff.Parameters.Add("@count_number", SqlDbType.VarChar, 255).Value = count_numberTextBox.Text;
querySaveStaff.Parameters.Add("@label", SqlDbType.VarChar, 255).Value = labelTextBox.Text;
querySaveStaff.Parameters.Add("@partner", SqlDbType.VarChar, 255).Value = partnerComboBox.Текст;
querySaveStaff.Parameters.Add("@tax_number", SqlDbType.VarChar, 255).Value = tax_numberTextBox.Text

Richard MacCutchan


FileStream fs = File.OpenRead(ofd.FileName);
MemoryStream ms = new MemoryStream();
axAcroPDF1.src = LocalEncoding.GetString(ms.ToArray());
fs.CopyTo(ms);

Я до сих пор не понимаю, о чем весь вышеприведенный код. Вам нужно только прочитать файл в массив байтов, чтобы получить его в базу данных. Затем, чтобы извлечь его, вы считываете запись базы данных в другой массив байтов и записываете ее в новый файл. Преобразование в строки и потоки памяти - это просто пустая трата времени и усилий.

Richard MacCutchan

Я также заметил, что у вас есть поле под названием file_location. Для чего это нужно? Если вы сохраняете расположение файла на диске и его содержимое, то одно из этих полей является избыточным.

Goran Bibic

Как получить данные из БД?

Я пытаюсь это сделать...но что-то не так...файл pdf

Другие значения текстового поля и поля со списком в порядке

частная DocumentsDataGridView_SelectionChanged недействительным(объект отправителя, EventArgs в электронной)
{
if (documentsDataGridView.Избранные воробьи.Count > 0)
{

string id = documentsDataGridView.SelectedRows[0].Ячейки["dataGridViewTextBoxColumn1"].значение.Метод toString();
номер строки = documentsDataGridView.SelectedRows[0].Ячейки["dataGridViewTextBoxColumn2"].значение.Метод toString();
строка count_number = documentsDataGridView.SelectedRows[0].Ячейки["dataGridViewTextBoxColumn3"].значение.Метод toString();
строка label = documentsDataGridView.SelectedRows[0].Ячейки["dataGridViewTextBoxColumn4"].значение.Метод toString();
строки партнер = documentsDataGridView.SelectedRows[0].Ячейки["dataGridViewTextBoxColumn5"].значение.Метод toString();
строка tax_number = documentsDataGridView.SelectedRows[0].Ячейки["dataGridViewTextBoxColumn6"].значение.Метод toString();
строка file_location = documentsDataGridView.SelectedRows[0].Ячейки["file_location"].Value.Метод toString();



idTextBox.Текст = id;
numberTextBox.Текст = число;
count_numberTextBox.Текст = count_number;
labelTextBox.Текстовая метка;
partnerComboBox.Текст = партнер;
tax_numberTextBox.Текст = tax_number;
dateDateTimePicker.Значение = Конвертировать.Объект todatetime(documentsDataGridView.SelectedRows[0].Ячейки["dataGridViewTextBoxColumn7"].значение);
file_locationTextBox.Текст = file_location;


пробовать
{
if (documentsDataGridView.SelectedRows[0].Ячейки["pdf_file"].Значение != null)

{

//FileStream fs = файл.OpenRead(ofd.FileName);
//MemoryStream ms = Новый Поток памяти();
//Ф.Метод CopyTo(МС);


//byte[] ap = (byte[])(documentsDataGridView.SelectedRows[0].Ячейки["pdf_file"].Ценность);
//MemoryStream ms = новый MemoryStream(ap);
//axAcroPDF1.src = локальное кодирование.GetString(ms.Метод toArray());
//axAcroPDF1.LoadFile(ms);


// //// управления PictureBox.Image = ConvertBinaryToImage(list[listView.Сфокусированный взгляд.индексные данные);

// byte[] ap = (byte[])(documentsDataGridView.SelectedRows[0].Ячейки["pdf_file"].Ценность);
// MemoryStream ms = новый MemoryStream(ap);
// ms.Position = 0;
// Файл.WriteAllBytes(@"C:\PDFs.pdf", Мисс Тоаррей());
// //Процесс.Старт(@"C:\PDFs.pdf");
// axAcroPDF1.LoadFile(@"C:\PDFs.pdf");
// axAcroPDF1.Включен = истина;

// SqlConnection connection = новый SqlConnection(cs);
// соединение.Открыть();
// SqlCommand command = new
// SqlCommand("select pdf_file from documents where id=" + idTextBox.Text, connection);
// byte[] buffer = (byte[])команда.Executescalar так();
// соединение.Закрывать();
// FileStream fs = новый FileStream(@"C:\PDFs\test.pdf", FileMode.Создавать);
// //fs.Write(buffer, 0, buffer.Длина);
// //fs.Close();

//axAcroPDF1.LoadFile(@"C:\PDFs\test.pdf");
//axAcroPDF1.Включен = истина;


}
еще
{
axAcroPDF1.в src = нуль;
}
}
ловить
{
axAcroPDF1.в src = нуль;
}

//Функция sqlconnect