Zujaj Ответов: 0

Как вставить несколько видеофайлов в базу данных


Я создаю небольшую админ-панель (настольное приложение) для управления видео(вставка,обновление,удаление и воспроизведение).До сих пор я могу вставить один видеофайл в базу данных через 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...

0 Ответов