Как вставить несколько видеофайлов в базу данных
Я создаю небольшую админ-панель (настольное приложение) для управления видео(вставка,обновление,удаление и воспроизведение).До сих пор я могу вставить один видеофайл в базу данных через OpenFileDialog.
Нажмите здесь, чтобы увидеть
Код Кнопки Загрузки
private void metroButton4_Click(object sender, System.EventArgs e) { openFileDialog1.Filter = "Mp4|*.mp4"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { try { //Global Variables => string path = "" ,fileName =""; byte[] videoData = null; path = openFileDialog1.FileName; fileName = openFileDialog1.SafeFileName; metroTextBox1.Text = fileName; metroButton4.Text = "Change"; videoData = File.ReadAllBytes(path); } catch (Exception ex) { MetroMessageBox.Show(this,ex.Message); } } }
Вставить Код Кнопки
private void metroButton2_Click(object sender, System.EventArgs e) { if (videoData != null && metroTextBox1.Text == "") { MetroMessageBox.Show(this, "Please enter a name for this video", "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } if (videoData == null) { MetroMessageBox.Show(this, "Please ensure that you have choosen a video to upload", "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } if (videoData != null && metroTextBox1.Text != "") { try { cmd = new SqlCommand("INSERT INTO VideoRecords(Name,Video) VALUES(@name,@video) ", mcObject.getConnection()); cmd.Parameters.AddWithValue("@name", metroTextBox1.Text); cmd.Parameters.AddWithValue("@video", videoData); mcObject.openCon(); cmd.ExecuteNonQuery(); mcObject.closeCon(); MetroMessageBox.Show(this, metroTextBox1.Text + " inserted successfully!", "Insertion Successful", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); metroButton1_Click(sender, e); //Refreshes the form } catch (Exception ex) { MetroMessageBox.Show(this, ex.Message, "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Error); } } }
Теперь мне нужно улучшить этот код, чтобы загрузить несколько файлов и вставить их в базу данных.Ваша помощь была бы весьма ощутима.
Что я уже пробовал:
1. Установите для свойства MultiSelect OpenFileDialog значение true.
2. Установите для свойства MultiLine metroTextBox1 значение true.
3. Измените код для кнопки загрузки
if (openFileDialog1.ShowDialog() == DialogResult.OK) { foreach (string file in openFileDialog1.FileNames) { try { path = file; fileName += openFileDialog1.SafeFileName; metroTextBox1.Text += path; metroButton4.Text = "Change"; videoData = File.ReadAllBytes(path); } catch (Exception ex) { MetroMessageBox.Show(this, ex.Message); } }
Результат
Не повезло.
Требуемая Цель
1. получите отдельные пути для каждого видеофайла и отобразите их в текстовом поле вместе с расширением (. mp4).
2.Магазин видео-контента, в видеоданные, переменная для каждого видео.
3. Наконец, вставьте эти загруженные файлы в базу данных.
Patrice T
Короткий ответ: Не храните видео в базе данных, это злоупотребление.
Zujaj
- Простите?
Michael_Davies
Не очень хорошая идея хранить видеофайлы в базе данных, в основном из-за размера, обычной практикой является сохранение ссылки на местоположение видео.
Однако:
Вы говорите "не повезло", "в каком смысле не повезло", "что происходит не так", и использовали ли вы отладчик для проверки содержимого path в этот момент;
файл видеоданных =.ReadAllBytes(путь);
Zujaj
Я не понимаю, почему вы фокусируете меня не на том, чтобы хранить содержимое видеофайла в базе данных, я просто сохраняю его как varbinary(max) и храню его так, чтобы я мог получить видео для воспроизведения в axWindowsMediaplayer, и да, я отладил на данный момент, это позволяет мне хранить двоичные данные внутри байтового массива.
Michael_Davies
Так в чем же ценность пути? и в чем же проблема?
Никакая удача не является хорошим руководством, чтобы помочь нам помочь вам решить эту проблему, она никому ничего не объясняет. Если вы отладили, то в чем проблема? Помните, что мы не можем видеть ваш компьютер.
Zujaj
Проблема в том, что видеоданные хранят только содержимое последнего видеофайла, а не каждый видеофайл отдельно.
Michael_Davies
Глядя на ваш код, videoData перезаписывается каждый раз, когда загружается файл, поэтому каждый раз он будет содержать только последний файл.
Либо вставляйте в базу данных во время загрузки, либо храните список файлов в строковом массиве/списке, а кнопка insert ходит по списку имен файлов, открывая, загружая и вставляя их одно за другим, что является лучшим решением, так как снижает использование памяти, поскольку в памяти хранится только одно видео за раз.
Zujaj
Сегодня вместо metrotextBox я использовал checkedlistbox для отображения файлов отдельно, модифицированный код
openFileDialog1.Filter = " Mp4|*. mp4";
if (openFileDialog1.ShowDialog () = = DialogResult.ОК)
{
foreach (строковый файл в openFileDialog1.файловые имена)
{
пробовать
{
путь = файл;
fileName = Path. GetFileNameWithoutExtension(путь);
checkedListBox1.Предметы.Добавить (имя файла);
metroTextBox1. Text += путь;
метробуттон4.изменение текста";
файл видеоданных =.ReadAllBytes(путь);
}
поймать (исключение бывший)
{
Метромессагбокс.Показать (это, например, сообщение);
}
}
Не могли бы вы сказать мне, как я могу хранить эти элементы списка в массиве файлов?
Michael_Davies
Технически вам ничего не нужно делать при загрузке, кроме как выполнить openfiledialog.opendialog, а затем поместить цикл foreach для имен файлов в процедуру вставки, если вы не используете openfiledialog повторно, он уже содержит список файлов.
Zujaj
Не могли бы вы закодировать его, я пытаюсь, но все еще не могу этого сделать?
Michael_Davies
if (openFileDialog1.ShowDialog () = = DialogResult.ОК)
{
foreach (строковый файл в openFileDialog1.файловые имена)
{
пробовать
{
путь = файл;
именем += openFileDialog1.SafeFileName;
metroTextBox1. Text += путь;
метробуттон4.изменение текста";
}
поймать (исключение бывший)
{
Метромессагбокс.Показать (это, например, сообщение);
}
}
частная metroButton2_Click недействительным(объект отправителя, система.EventArgs e)
{
если (metroTextBox1.Текст == "")
{
Метромессагбокс.Показать (это, "пожалуйста, введите имя для этого видео", " Внимание!", MessageBoxButtons.Хорошо, MessageBoxIcon.Восклицание);
}
ещё
{
пробовать
{
mcObject.openCon();
foreach (строковый файл в openFileDialog1.файловые имена)
{
файл видеоданных =.ReadAllBytes(путь);
КМД = новая команда sqlcommand("вставить в видеозаписи(имя,видео) значения(@имя,@видео) ", mcObject.метод getconnection());
УМК.Параметры.AddWithValue ("@name", файл);
УМК.Параметры.AddWithValue ("@video", videoData);
УМК.Метод executenonquery();
}
mcObject.closeCon();
}
поймать (исключение бывший)
{
Метромессагбокс.Показать(это, экс.Сообщение, "Внимание!", MessageBoxButtons.Хорошо, MessageBoxIcon.Ошибка);
}
}
}
Zujaj
Что вы подразумеваете под следующим?(После cmd.Метод executenonquery())
Michael_Davies
извините за старые привычки VB...