Загрузить файл из DataGridViewLinkColumn, хранящийся в виде байтовых данных в базе данных SQL - Приложение Windows Form - PullRequest
0 голосов
/ 05 июля 2018

Я делаю приложение Windows формы, я использую OpenFileDialog для хранения моих данных в базе данных SQL в виде байтов. Я включил код: данные Fill показывают данные в столбцах DataGridViewLink, а функция button2_click (кнопка «Обзор и сохранение») сохраняет их в базе данных SQL.

    private void button2_Click(object sender, EventArgs e)
    {
        DialogResult res = openFileDialog1.ShowDialog();
        if (res == DialogResult.OK)
        {
            FileInfo fi = new FileInfo(openFileDialog1.FileName);
            byte[] documentContent = File.ReadAllBytes(openFileDialog1.FileName);

            string name = fi.Name;
            string extn = fi.Extension;
            using (SqlConnection cn = new SqlConnection(LOC))
            {
                SqlCommand cmd = new SqlCommand("SaveDocument", cn);
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = name;
                cmd.Parameters.Add("@Content", SqlDbType.VarBinary).Value = documentContent;
                cmd.Parameters.Add("@Extn", SqlDbType.VarChar).Value = extn;
                cmd.Parameters.Add("@Year", SqlDbType.Int).Value = 2018;

                cn.Open();
                cmd.ExecuteNonQuery();
            }
            FillData();

        }
    }

    private void FillData()
    {

        DataTable dt = new DataTable();
        using (SqlConnection cn = new SqlConnection(LOC))
        {
            SqlCommand cmd = new SqlCommand("GetDocuments", cn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@Year", SqlDbType.Int).Value = "2018";
            cn.Open();
            SqlDataReader reader = cmd.ExecuteReader();

            dt.Load(reader);
        }
        if(dt.Rows.Count > 0)
        {
            dataGridView1.DataSource = dt;
            foreach (DataGridViewColumn colu in dataGridView1.Columns)
            {
                if (colu.HeaderText != "Name")
                    colu.Visible = false;
            }
        }

    }

    private void ITDec2018_Load(object sender, EventArgs e)
    {
        DataGridViewLinkColumn col = new DataGridViewLinkColumn();
        col.DataPropertyName = "DName";
        col.Name = "Name";
        dataGridView1.Columns.Add(col);
        FillData();
    }

F.Y.I: Я создаю свой собственный столбец таблицы только для имени и скрываю другие столбцы. DName - имя файла в базе данных

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

База данных SQL

Форма с колонкой datagridViewLink

Так как мне делать то, что спрашивают, обновлять функцию cell content_click и, если да, то как?

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
     }

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 05 июля 2018

Я бы посоветовал вам добавить идентификатор также в представление данных и использовать этот код, заменив соединение и исправив SQL-запрос к имени вашей базы данных

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {

        string id = dgv.Rows[e.RowIndex].Cells[0].Value.ToString();

        string sqlQuery = string.Format("SELECT DocumentContent,DBName FROM myDatabase WHERE ID={0};", id);

        SqlDataAdapter myAdapter1 = new SqlDataAdapter(sqlQuery, myConnection);
        DataTable dt = new DataTable();
        myAdapter1.Fill(dt);

        Stream myStream;
        SaveFileDialog saveFileDialog1 = new SaveFileDialog();

        saveFileDialog1.Filter = "All files (*.*)|*.*";
        saveFileDialog1.FilterIndex = 1;
        saveFileDialog1.RestoreDirectory = true;


        foreach (DataRow row in dt.Rows)
        {
            byte[] byteArray = (byte[])row["DocumentContent"];
            string name = (string)row["DBName"];
            saveFileDialog1.FileName = name;
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                 if ((myStream = saveFileDialog1.OpenFile()) != null)
                 {
                      myStream.Write(byteArray, 0, byteArray.Length);
                      myStream.Close();
                 }
             }

            //File.WriteAllBytes("Path\\" + name, byteArray);
        }

    }
...