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

时间:2013-08-30 05:17:55

标签: c# asp.net .net sql sql-server-2008

我在webform上有5个FileUpload控件..我有两个sql server表...

Tbl_ClaimDetails

SrNo | Remark | BrMkrdt

Tbl_ClaimImages

SrNo | Img | Id | ImgName

第一个文件上传控件是强制性的。例如,如果用户选择要上传的3个文件,则第一个图像文件用于通过存储过程将数据插入Tbl_ClaimDetailsTbl_ClaimDetails中的SrNo是身份)我将使用{{返回最后一个srno 1}}。我将此SCOPE_IDENTITY()值存储在变量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中插入值。是否可以在一次执行中使用一个存储过程完成所有这些操作?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

为了减少调用次数并一次性完成任务,我认为只有一种方法可以假设您拥有MS-SQL Server 2008+数据库并且没有使用ADO.Net SQL Client的约束。

  1. 在SQL Server中创建两个TableTypes,具有两个表的相同模式,即Tbl_ClaimDetails和Tbl_ClaimImages
  2. 创建一个存储过程,其中包含两个参数,即您创建的TableType。
  3. 存储过程可以有Merge语句,可以帮助您轻松插入父子表。
  4. 在.Net中创建两个DataTable,它应该具有相同的基础数据库表结构,对于文件,您可以使用byte [] [试一试]。
  5. 使用Sql.Structured数据类型并将这两个数据表传递给创建的存储过程。
  6. 您也可以从代码项目中找到How to use table type in SQL的示例代码。

    使用这种方法,您只需要一次调用具有完整数据结构的SQL。我希望这能帮助你满足你所看到的目标。