将 DbDataReader 的结果转换为 ASP.NET MVC 4 中的数据库模型,来自使用 ADO.NET 的存储过程 [重复]

Posted

技术标签:

【中文标题】将 DbDataReader 的结果转换为 ASP.NET MVC 4 中的数据库模型,来自使用 ADO.NET 的存储过程 [重复]【英文标题】:Translate result of DbDataReader to database model in ASP.NET MVC 4, coming from a stored procedure using ADO.NET [duplicate] 【发布时间】:2022-01-21 00:44:49 【问题描述】:

我有一个用户定义的存储过程,它返回多个实际表作为结果集:

CREATE PROCEDURE uspDemo
    (@UserID BIGINT = 0,
     @IsAdmin BIT = 0,
     @Title VARCHAR(120) = '')
AS
BEGIN 
    ------Retrieve Posts------
    SELECT * 
    FROM tblPost AS MP 
    INNER JOIN tblUserProfile AS UP ON UP.ID = MP.UserID
    WHERE UP.ID = @UserID 
      AND ((@IsAdmin = 0 AND MP.IsDeleted = 0 AND MP.IsApproved = 1)
           OR (@IsAdmin = 1 OR MP.IsDeleted = 0 OR MP.IsApproved = 1))

    ----- Retrieve Tags------
    SELECT *  
    FROM tblTagMasters AS MT 
    INNER JOIN tblPostTags AS MP ON MT.TagID = MP.TagID
 
    --------Retrieve User likes-----
    SELECT * 
    FROM tblUserLikes AS UV 
    INNER JOIN tblPost AS MP ON MP.PostId = UV.PostId
END

如何在 ASP.NET MVC 中翻译?请帮帮我。

【问题讨论】:

我假设,您想使用 ado.net 检索上述 3 个结果集并将这些值存储在不同的不同模型中。请参考此链接以了解。 [链接]khalidabuhakmeh.com/…。您还必须在连接字符串中启用多个结果集。参考链接docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/… MultipleActiveResultSets 与此无关。它使您能够从两个 seperate SqlCommand 中同时激活两个 seperate SqlDataReader。这里有一个 SqlCommand 和一个 SqlDataReader。 【参考方案1】:

基本上,你需要这样的东西:

// define connection string and command for your query
string connectionString = ".....";    // typically load from config
string storedProcedureName = "dbo.uspDemo";

// put your disposable ADO.NET objects into proper "using ()" blocks    
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(storedProcedureName, conn))

    cmd.CommandType = CommandType.StoredProcedure;
    
    // define the parameters
    cmd.Parameters.Add("@UserID", SqlDbType.BigInt).Value = .....;
    cmd.Parameters.Add("@IsAdmin", SqlDbType.Bit).Value = .....;
    cmd.Parameters.Add("@Title", SqlDbType.VarChar, 120).Value = ".....";

    // open connection
    conn.Open();

    // execute stored procedure to get the data reader
    using (SqlDataReader reader = cmd.ExecuteReader())
    
        // read the first set of data returned
        while (reader.Read())
        
            // read the values, construct an object from it, store the object into a list or something
        
        
        // get the next set of result data
        reader.NextResult();
        
        // read the second set of data returned
        while (reader.Read())
        
            // read the values, construct an object from it, store the object into a list or something
        
        
        // get the next set of result data
        reader.NextResult();
        
        // read the third set of data returned
        while (reader.Read())
        
            // read the values, construct an object from it, store the object into a list or something
        
    

    conn.Close();

剩下的细节由你决定——做一些研究吧!

【讨论】:

我想你的意思是.NextResult() @JonathanWillcock:绝对正确 - 是的,我的错 - 错字已更正,谢谢! Dapper 可以帮助减少样板 DataReader-to-Object 代码。 dapper-tutorial.net/result-multi-mapping 如果我们不想一个一个地读取表格数据,那么我应该如何转换为表格列表。

以上是关于将 DbDataReader 的结果转换为 ASP.NET MVC 4 中的数据库模型,来自使用 ADO.NET 的存储过程 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Entity Framework Core 2.0 中从 DbDataReader 转换为 Task<IEnumerable<TEntity>>?

用asp怎么将查询结果转化为json

DbDataReader、NextResult() 和填充多个表

C# 将 Saxon XSLT 转换结果显示到当前 ASP.NET 容器页面

将 UTC 转换为本地时间会返回奇怪的结果

在 ASP.NET 中将 MS Word 文档转换为 PDF [关闭]