如何从详细信息视图中填充数据表

how to fill datatable from details view

我有一个工单管理应用程序,我被要求添加一个新功能,他们想要一种附加文档、pdf、图像等的方法

<asp:TemplateField HeaderText="Attach">
    <InsertItemTemplate>
        <asp:FileUpload ID="FileUpload1" runat="server" AllowMultiple="True" />
        <asp:Button ID="Upload" runat="server" Text="Upload" OnClick="Upload_Click" />
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundField DataField="Name" HeaderText="File Name" />
            </Columns>
        </asp:GridView>
    </InsertItemTemplate>
</asp:TemplateField>

我使用了文件上传

现在我希望仅当用户单击提交时才将附件插入数据库,所以我在想是否有一种方法可以在用户单击时将详细信息视图中的附件插入到数据中 table单击上传按钮,然后我可以将该数据 table 绑定到 gridview,当用户单击提交时,我希望它被插入到数据库中?

我的代码隐藏

protected void Upload_Click(object sender, EventArgs e)
{         
    FileUpload file1 = (FileUpload)DetailsView1.FindControl("FileUpload1");
    foreach (HttpPostedFile postedFile in file1.PostedFiles)
    {
        string filename = Path.GetFileName(postedFile.FileName);

        using (Stream fs = postedFile.InputStream)
        {
            using (BinaryReader br = new BinaryReader(fs))
            {
                byte[] bytes = br.ReadBytes((Int32)fs.Length);
                string constr = ConfigurationManager.ConnectionStrings["WorkOrderConnectionString3"].ConnectionString;
                using (SqlConnection con = new SqlConnection(constr))
                {
                    DataTable table = CreateDatatable();
                    table.Rows.Add()
                    string query = "insert into tblFiles values (@Name, @Data)";
                    using (SqlCommand cmd = new SqlCommand(query))
                    {
                        cmd.Connection = con;
                        cmd.Parameters.AddWithValue("@Name", filename);                                
                        cmd.Parameters.AddWithValue("@Data", bytes);
                        con.Open();
                        cmd.ExecuteNonQuery();
                        con.Close();
                    }
                }
            }
        }
    }
    Response.Redirect(Request.Url.AbsoluteUri);
}

正如您在上面看到的,我想插入 datatable detailsview.findcontrol("fileupload1") 值而不是插入 table。

任何建议将不胜感激...

一些观察:

不要使用关系数据库来存储文件。可以这样想:如果您永远不会 filtering/querying 列中的某个值,那么该列只会让您花钱。将文件存储在磁盘上,并在 NoSql table 中保留对文件名和路径的引用。它更便宜、更快速、处理起来更简单。

您可以轻松 post 存储文件,并提交 table 包含文件名、路径和您计算的有效期 date/time,即 24 小时.夜间进程可以从提交 table 中删除所有过期文件,当您的用户单击提交时,文件将添加到不同的 table(但仍然是 NoSQL,永远不要使用关系数据库对于文件!),只有文件名、路径和其他重要信息被移动。

试试这个:

protected void Upload_Click(object sender, EventArgs e)
{         
    FileUpload file1 = (FileUpload)DetailsView1.FindControl("FileUpload1");

    DataTable table = new DataTable();
    table.Columns.Add("FileName", typeof(string));
    table.Columns.Add("Bytes", typeof(byte[]));

    foreach (HttpPostedFile postedFile in file1.PostedFiles)
    {
        string filename = Path.GetFileName(postedFile.FileName);

        using (Stream fs = postedFile.InputStream)
        {
            using (BinaryReader br = new BinaryReader(fs))
            {
                byte[] bytes = br.ReadBytes((Int32)fs.Length);
                table.Rows.Add(fileName, bytes);
            }
        }
    }
    Response.Redirect(Request.Url.AbsoluteUri);
}