【问题标题】:What will be the best approach for uploading multiple files to database with single execution of stored procedure通过单次执行存储过程将多个文件上传到数据库的最佳方法是什么
【发布时间】:2013-08-30 05:17:55
【问题描述】:

我在一个网络表单上有 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

现在我正在使用另一个存储过程在第一张图像的Tbl_ClaimImages 中插入数据以及 lastid..

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 中插入值。是否有可能在一次执行中使用一个存储过程来完成所有这些工作?还是有更好的方法?

【问题讨论】:

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


    【解决方案1】:

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

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

    您也可以从代码项目中找到How to use table type in SQL 的示例代码。

    使用这种方法,您只需一次调用具有完整数据结构的 SQL。我希望这将帮助您了解您正在查看的内容。

    【讨论】:

    • 我认为 Merge 在我的情况下不是必需的,但 +1 表示建议,现在我的知识库中还有一件事:) 谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    相关资源
    最近更新 更多