有没有办法使用Dapper.NET与返回多个结果集的存储过程?
在我的例子中,第一个结果集是一行,只有一列; 如果是,0则调用成功,第二个结果集将包含实际的行/列数据.(如果它不为零,则会发生错误,并且不会提供第二个结果集)
有没有机会用Dapper.NET处理这个?到目前为止,我只回到那个单身0- 但仅此而已.
更新:好的,它工作正常 - 只要结果集没有.2是单个实体:
Dapper.SqlMapper.GridReader reader =
_conn.QueryMultiple("sprocname", dynParams,
commandType: CommandType.StoredProcedure);
int status = reader.Read<int>().FirstOrDefault();
MyEntityType resultObj = reader.Read<MyEntityType>().FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
现在,我还有另一项要求.
对于第二个结果集,Dapper的多映射(将从SQL Server返回的单行拆分为两个独立的实体)似乎尚未得到支持(至少似乎没有.Read<T>可以处理的重载)多映射).
如何将该行拆分为两个实体?
我有一个SP,我试图返回2个结果集,并在我的.cs文件中我尝试这样的事情:
dr = cmd.ExecuteReader();
while (dr.Read())
{
RegistrationDetails regDetails = new RegistrationDetails()
{
FName = dr["FName"].ToString(),
LName = dr["LName"].ToString(),
MName = dr["MName"].ToString(),
EntityName = dr["EntityName"].ToString(),// in 2nd result set
Percentage = dr["Percentage"].ToString()// in 2nd result set
};
}
Run Code Online (Sandbox Code Playgroud)
但是我得到了:
错误:IndexOutOfRange {"EntityName"}
我在数据库中有这两个表与一个(类别)到多个(产品)关系
Table Product
Name
Description
ProductCategory
Table Category
Category
Description
Run Code Online (Sandbox Code Playgroud)
而这些课程;
public class Product
{
public string Name { get; set; }
public string Description { get; set; }
public Category CategoryName { get; set}
}
public class Category
{
public string CategoryName { get; set; }
public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想在列表中找到包含所有产品和类别对象数据的列表.我已经阅读了关于multipleResults和queryMultiple但是看不到如何将两者结合在一起.我知道如何为单个产品做到这一点但是所有具有各自类别对象的产品也是如此.
我们遵循以下方法使用LINQ To SQL从多个结果中获取数据
CREATE PROCEDURE dbo.GetPostByID
(
@PostID int
)
AS
SELECT *
FROM Posts AS p
WHERE p.PostID = @PostID
SELECT c.*
FROM Categories AS c
JOIN PostCategories AS pc
ON (pc.CategoryID = c.CategoryID)
WHERE pc.PostID = @PostID
Run Code Online (Sandbox Code Playgroud)
继承自DataContext的类中的调用方法应如下所示:
[Database(Name = "Blog")]
public class BlogContext : DataContext
{
...
[Function(Name = "dbo.GetPostByID")]
[ResultType(typeof(Post))]
[ResultType(typeof(Category))]
public IMultipleResults GetPostByID(int postID)
{
IExecuteResult result =
this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())),
postID);
return (IMultipleResults)(result.ReturnValue);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,该方法不仅使用映射到存储过程名称的Function属性进行修饰,而且还使用带有存储过程返回的结果集类型的ReturnType属性进行修饰.此外,该方法返回IMultipleResults的无类型接口:
public interface IMultipleResults : IFunctionResult, IDisposable
{
IEnumerable<TElement> GetResult<TElement>(); …Run Code Online (Sandbox Code Playgroud) 在EF4中,这不容易实现.您必须降级为经典ADO.NET(DataReader),使用ObjectContext.Translate或使用EFExtensions项目.
这是在EF CTP5中实现的吗?
如果没有,推荐的方法是什么?
我们是否必须转换DbContext<T>为a IObjectContextAdapter并访问底层ObjectContext以获得此方法?
有人能指点我用EF CTP5做一篇好文章吗?
我正在使用sails -mssqlserver适配器的sails js .它的问题是,如果我的存储过程返回多个结果集,那么我只收到一个最新的结果集.使用Java可以正常运行相同的存储过程,并且我可以迭代相关的结果集.
我需要知道是否有一些特定的方法来访问sails-mssqlserver中的所有结果集?
sql-server multiple-resultsets node.js sails.js sails-mssqlserver
这篇文章展示了在单个JDBC调用(针对SQL Server数据库)中执行多个查询,方法是用分号分隔它们.当我尝试对Oracle 10G执行相同操作时,会出现错误"无效字符":
class db
{
public static void main(String aa[])throws Exception
{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@//192.168.10.29:1521/ttt","username","password");
PreparedStatement stat = conn.prepareStatement("select voila from app where rownum<4; select code from process where rownum<4");
stat.execute();
while (stat.getMoreResults()){
ResultSet rs = stat.getResultSet();
while (rs.next()){
System.out.println(rs.getString(1));
}
}
conn.close();
}
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么 ?
所有基本的MVC内容.
当我运行应用程序时,我收到重复的记录.要进一步限定,如果订单有多行,则返回"订单"中每行的第一条记录.
SQL Results
Order, Line, Part
12345, 1, 3829138120
12345, 2, 1238401890
MVC/EF Results
Order, Line
12345, 1, 3829138120
12345, 1, 3829138120
Run Code Online (Sandbox Code Playgroud)
有关这个问题的原因的任何想法?
sql-server asp.net-mvc entity-framework duplicate-data multiple-resultsets
从我在Hibernate文档/在线中读到的内容来看,听起来Hibernate没有处理多个结果集的能力.我希望在依赖于Hibernate的应用程序中进行MySQL DB调用,这将返回多个结果集.
您使用哪种解决方案与Hibernate"玩得很好",请记住,这可能是唯一一个将返回多个结果集的调用?
谢谢!
我在 SQL Server 中有一个存储过程,它返回七个结果集。我想从 ASP.NET 调用此存储过程,并使用结果填充 ASP.NET 页面上的七个 GridView。我正在使用 SqlDataReader 来获取数据,但是我正在努力使用 C# 代码来填充 GridView。
我创建了一个 DAL 类来获取数据,其中有这个方法:
public SqlDataReader CheckDataIntegrity()
{
SqlCommand cmd = new SqlCommand("cc.DataCheck");
return MultipleResults(cmd);
}
Run Code Online (Sandbox Code Playgroud)
辅助方法 MultipleResults 如下所示:
private SqlDataReader MultipleResults(SqlCommand cmd)
{
SqlConnection con = new SqlConnection(_connectionString);
cmd.Connection = con;
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
con.Close();
return dr;
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下内容调用页面上的组件:
private void FillGridViews()
{
DBUtil DB = new DBUtil();
using (SqlDataReader dr = DB.CheckDataIntegrity())
{
if (dr.HasRows)
{
while (dr.Read())
{
GridView1.DataSource = dr;
GridView1.DataBind(); …Run Code Online (Sandbox Code Playgroud) 我似乎对我的结果集有一些问题,我给它们命名不同,但它们似乎都有相同的数据,但我无法弄明白为什么.
String query = "SELECT * FROM blog_comments;";
ResultSet rs = stmt.executeQuery(query);
ResultSetMetaData rsmd = rs.getMetaData();
int colNum = rsmd.getColumnCount();
boolean more = rs.next();
String query2 = "SELECT * FROM blog_entries;";
ResultSet rs2 = stmt.executeQuery(query2);
ResultSetMetaData rsmd2 = rs2.getMetaData();
int colNum2 = rsmd2.getColumnCount();
boolean more2 = rs2.next();
Run Code Online (Sandbox Code Playgroud)
我看过调试,他们都有相同的列,但我不认为他们应该有任何建议.
我对c#很新.我有一个需要多个记录集的页面,以及一个返回它们的sproc.我正在使用主记录集的转发器控件.如何进入下一个返回的记录集?
好的,所以数据源在aspx页面中.我会把它移到页面后面的代码中使用NextResult吗?这是我现在的代码.如何将数据源移动到代码隐藏,实现datareader以便我可以使用nextresult?
<asp:SqlDataSource ID="AssetMgtSearch" runat="server"
ConnectionString="<%$ ConnectionStrings:OperationConnectionString %>"
SelectCommand="spAssetMgtItemList" SelectCommandType="StoredProcedure">
</asp:SqlDataSource>
<div class="contentListFullHeight">
<table cellspacing="0" cellpadding="0" border="0" class="contentList">
<tr>
<th>ShipmentID/</td>
<th>MaterialID/</td>
<th>ItemID/</td>
</tr>
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="AssetMgtSearch">
<ItemTemplate>
<tr>
<td colspan="3" style="border-top:solid thin blue"> </td>
</tr>
<tr>
<td><%#Container.DataItem(0)%></td>
<td><%#Container.DataItem(1)%></td>
<td><%#Container.DataItem(2)%></td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
Run Code Online (Sandbox Code Playgroud) c# ×4
java ×3
sql-server ×3
dapper ×2
jdbc ×2
.net ×1
asp.net ×1
asp.net-mvc ×1
hibernate ×1
linq-to-sql ×1
node.js ×1
oracle ×1
resultset ×1
sails.js ×1
sql ×1