通过一次执行存储过程将多个文件上传到数据库的最佳方法是什么

本文关键字:文件 数据库 是什么 方法 最佳 一次 存储过程 执行 | 更新日期: 2023-09-27 18:29:32

我在一个web表单上有5个FileUpload控件。。我有两个sql server表。。。

Tbl_ClaimDetails

SrNo | Remark | BrMkrdt

Tbl_ClaimImages

SrNo | Img | Id | ImgName

第一个文件上传控制是强制性的。例如,如果用户选择了3个要上传的文件,则第一个图像文件用于通过存储过程将数据插入Tbl_ClaimDetailsTbl_ClaimDetails中的SrNo是身份),我使用SCOPE_IDENTITY()返回最后一个SrNo。我将此SCOPE_IDENTITY()值存储在变量lastid

现在,我正在使用另一个存储过程将数据与lastid一起插入第一个图像的Tbl_ClaimImages中。。

if (file1.ContentLength > 0 && (u1 != null || u1 != 0))
{
                Stream fs = file1.InputStream;
                BinaryReader br = new BinaryReader(fs);
                Byte[] bytes = br.ReadBytes((Int32)fs.Length);
//store procedure inserts data in tbl_claimdetails and return SCOPE_IDENTITY()
                lastid = dbo.ExecProc1(claim.Remark,  claim.BrMkrdt);
//another stored procedure inserts data in tbl_ClaimImages
                dbo.insert(bytes, lastid, file1.FileName);    
             count++;
}
if (file2.ContentLength > 0 && (u1 != null || u1 != 0))
{
                Stream fs = file2.InputStream;
                BinaryReader br = new BinaryReader(fs);
                Byte[] bytes = br.ReadBytes((Int32)fs.Length);                
                dbo.insert(bytes, lastid, file1.FileName);    
             count++;
}// and so on till file5

这种方法运行良好。我没有任何错误或问题,但我想知道是否有比这更好的方法?正如您所看到的,我正在执行两个不同的存储过程,用于在给定的表中插入值。在Tbl_ClaimDetails中插入值的存储过程一开始只执行一次,然后我一次又一次地执行另一个存储过程,以根据用户上传的图像数量在Tbl_ClaimImages中插入值。是否可以在一次执行中使用一个存储过程来完成所有这些?或者有更好的方法吗?

通过一次执行存储过程将多个文件上传到数据库的最佳方法是什么

为了减少调用次数并一次完成任务,我认为只有一种方法可以假设您拥有MS-SQL Server 2008+数据库,并且不受使用ADO.Net SQL客户端的限制。

  1. 在SQL Server中创建两个表类型,使用两个表的相同模式,即Tbl_CClaimDetails和Tbl_ClaimImages
  2. 创建一个具有两个参数的存储过程,即您创建的TableTypes
  3. 存储过程可以有Merge语句,它可以帮助您轻松地插入父子表
  4. 在.Net中创建两个DataTable,它们应该具有和底层数据库表相同的结构,对于文件,您可以使用byte[][试一试]
  5. 使用Sql.Structured数据类型并将这两个数据表传递给创建的存储过程

此外,您还可以从代码项目中找到"如何在SQL中使用表类型"的示例代码。

使用这种方法,您只需要对具有完整数据结构的SQL进行一次调用。我希望这将帮助您满足您的需求。