【问题标题】:how to fill datatable from details view如何从详细信息视图中填充数据表
【发布时间】:2016-05-13 05:28:14
【问题描述】:

我有一个工单管理应用程序,我被要求添加一个新功能,他们想要一种附加文档、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>

我使用了文件上传

现在我希望仅在用户单击提交时将附件插入数据库,所以我在想是否有办法在用户单击上传按钮时将附件从详细信息视图插入到数据表中,那么我可以将该数据表绑定到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") 值,而不是插入表格。

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

【问题讨论】:

    标签: c# asp.net sql-server datatable detailsview


    【解决方案1】:

    试试这个:

    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);
    }
    

    【讨论】:

    • 嘿,你的回答只起作用了,当你将文件名添加到表格行时,我必须将文件名更改为文件名,但是现在单击提交按钮时我将如何调用数据表行??跨度>
    • 您可以在您的班级内声明您的DataTable,以便从各处访问。或者创建一个DataTable 属性:public DataTable Table { get; set; },然后在您的事件处理程序中为其赋值。
    【解决方案2】:

    几个观察:

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

    您可以轻松地将文件发布到存储中,并有一个包含文件名、路径和您计算的到期日期/时间(即 24 小时)的提交表。每晚的进程可以从提交表中删除所有过期文件,当您的用户单击提交时,该文件将被添加到另一个表中(但仍然是 NoSQL,永远不要使用关系数据库来存储文件!)只有文件名称、路径和其他重要信息正在转移。

    【讨论】:

    • 为什么不呢?我的回答告诉 OP 创建一个提交表,提交时有一个过期日期——这是他描述的场景的非常常见的解决方案。将文件存储在 ER 数据库中是完全错误的,不应以任何方式鼓励。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2010-12-06
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多