关于EF调用存储过程碰到的问题解决过程
2017-04-23 12:48
399 查看
网上有人说不建议在EF中用存储过程,或许他是对的。
1. 调用mysql存储过程,存储过程为返回两个结果集
CREATE PROCEDURE pro_prevnextrecord(IN `iCmsID` varchar(50),IN `iCateID` varchar(50))
BEGIN
DROP TABLE IF EXISTS tmp1;
CREATE TEMPORARY TABLE tmp1(
`ID` VARCHAR(50) NOT NULL,
`Num` INTEGER NOT NULL,
PRIMARY KEY (`ID`))ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO tmp1(ID,Num)
SELECT id,row_no FROM
(SELECT a.id,a.CategoryID,a.Sysid,(@row_num:=@row_num+1) as row_no from cmscontent a,(select(@row_num:=0)) b ORDER BY a.categoryID,a.Sysid desc) c
WHERE c.CategoryID=iCateID
;
SELECT (@Num :=Num) as mynum FROM tmp1 WHERE id=iCmsID;
SELECT CONCAT('productdetail?ID=',a.id) AS LinkUrl,
CASE WHEN @Num<a.Num then '下一张' ELSE '上一张' END AS LinkText
FROM tmp1 a LEFT JOIN cmscontent b ON a.id=b.id WHERE a.Num=@Num-1 or a.Num=@Num+1 ORDER BY a.Num;
END
2. 在edmx生成存储过程函数方法.
现在双击edmx文件,展开视图界面右键找到从数据库更新模型,可以百度这里操作存储过程的资料。
如果在DbContext继承类里没有自动生成相应函数,则再次双击edmx文件,在展开的视图界面右键找到模型浏览器,单击它。在Store节点下存储过程/函数菜单里面可以发现所调用的存储过程名称,选中右键添加函数导入,返回复杂内容类型,点确定。
3. 选择edmx使用xml方式修改
在相应节点下修改成以下内容:
<FunctionImport Name="pro_prevnextrecord" >
<ReturnType Type="Collection(lab_equiModel.prevNextRecordResult1)"></ReturnType>
<ReturnType Type="Collection(lab_equiModel.prevNextRecordResult2)"></ReturnType>
<Parameter Name="iCmsID" Mode="In" Type="String" />
<Parameter Name="iCateID" Mode="In" Type="String" />
</FunctionImport>
<ComplexType Name="prevNextRecordResult1" >
<Property Name="mynum" Type="Int32" />
</ComplexType>
<ComplexType Name="prevNextRecordResult2" >
<Property Name="LinkUrl" Type="String" MaxLength="70" Unicode="true" FixedLength="false" />
<Property Name="LinkText" Type="String" MaxLength="10" Unicode="true" FixedLength="false" />
</ComplexType>
4. 运用T4模板
在tt扩展名文件的属性里面,检查自定义工具命名空间,空白的话就写上自己需要的命名空间。然后在其右键菜单上运行自定义工具。这里能自动补全返回集合类的各个字段。
5. 返回多记录集
在logic代码层,设置函数如下:
public List<prevNextRecordResult2> GetPrevnextrecord(string iCmsID, string iCateID)
{
var result2 = db.pro_prevnextrecord(iCmsID, iCateID).GetNextResult<prevNextRecordResult2>();
return result2.ToList();
}调用结果集在第二张表,则用GetNextResult
6.参考文章
http://www.codeproject.com/Articles/675933/Returning-Multiple-Result-Sets-from-an-Entity-Fram https://q.cnblogs.com/q/56836/ http://blog.csdn.net/leftfist/article/details/39226243 http://www.cnblogs.com/chenliyang/p/6633534.html
1. 调用mysql存储过程,存储过程为返回两个结果集
CREATE PROCEDURE pro_prevnextrecord(IN `iCmsID` varchar(50),IN `iCateID` varchar(50))
BEGIN
DROP TABLE IF EXISTS tmp1;
CREATE TEMPORARY TABLE tmp1(
`ID` VARCHAR(50) NOT NULL,
`Num` INTEGER NOT NULL,
PRIMARY KEY (`ID`))ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO tmp1(ID,Num)
SELECT id,row_no FROM
(SELECT a.id,a.CategoryID,a.Sysid,(@row_num:=@row_num+1) as row_no from cmscontent a,(select(@row_num:=0)) b ORDER BY a.categoryID,a.Sysid desc) c
WHERE c.CategoryID=iCateID
;
SELECT (@Num :=Num) as mynum FROM tmp1 WHERE id=iCmsID;
SELECT CONCAT('productdetail?ID=',a.id) AS LinkUrl,
CASE WHEN @Num<a.Num then '下一张' ELSE '上一张' END AS LinkText
FROM tmp1 a LEFT JOIN cmscontent b ON a.id=b.id WHERE a.Num=@Num-1 or a.Num=@Num+1 ORDER BY a.Num;
END
2. 在edmx生成存储过程函数方法.
现在双击edmx文件,展开视图界面右键找到从数据库更新模型,可以百度这里操作存储过程的资料。
如果在DbContext继承类里没有自动生成相应函数,则再次双击edmx文件,在展开的视图界面右键找到模型浏览器,单击它。在Store节点下存储过程/函数菜单里面可以发现所调用的存储过程名称,选中右键添加函数导入,返回复杂内容类型,点确定。
3. 选择edmx使用xml方式修改
在相应节点下修改成以下内容:
<FunctionImport Name="pro_prevnextrecord" >
<ReturnType Type="Collection(lab_equiModel.prevNextRecordResult1)"></ReturnType>
<ReturnType Type="Collection(lab_equiModel.prevNextRecordResult2)"></ReturnType>
<Parameter Name="iCmsID" Mode="In" Type="String" />
<Parameter Name="iCateID" Mode="In" Type="String" />
</FunctionImport>
<ComplexType Name="prevNextRecordResult1" >
<Property Name="mynum" Type="Int32" />
</ComplexType>
<ComplexType Name="prevNextRecordResult2" >
<Property Name="LinkUrl" Type="String" MaxLength="70" Unicode="true" FixedLength="false" />
<Property Name="LinkText" Type="String" MaxLength="10" Unicode="true" FixedLength="false" />
</ComplexType>
<FunctionImportMapping FunctionImportName="pro_prevnextrecord" FunctionName="lab_equiModel.Store.pro_prevnextrecord" > <ResultMapping> <ComplexTypeMapping TypeName="lab_equiModel.prevNextRecordResult1"> <ScalarProperty Name="mynum" ColumnName="mynum" /> </ComplexTypeMapping> </ResultMapping> <ResultMapping> <ComplexTypeMapping TypeName="lab_equiModel.prevNextRecordResult2"> <ScalarProperty Name="LinkUrl" ColumnName="LinkUrl" /> <ScalarProperty Name="LinkText" ColumnName="LinkText" /> </ComplexTypeMapping> </ResultMapping> </FunctionImportMapping>
4. 运用T4模板
在tt扩展名文件的属性里面,检查自定义工具命名空间,空白的话就写上自己需要的命名空间。然后在其右键菜单上运行自定义工具。这里能自动补全返回集合类的各个字段。
5. 返回多记录集
在logic代码层,设置函数如下:
public List<prevNextRecordResult2> GetPrevnextrecord(string iCmsID, string iCateID)
{
var result2 = db.pro_prevnextrecord(iCmsID, iCateID).GetNextResult<prevNextRecordResult2>();
return result2.ToList();
}调用结果集在第二张表,则用GetNextResult
6.参考文章
http://www.codeproject.com/Articles/675933/Returning-Multiple-Result-Sets-from-an-Entity-Fram https://q.cnblogs.com/q/56836/ http://blog.csdn.net/leftfist/article/details/39226243 http://www.cnblogs.com/chenliyang/p/6633534.html
相关文章推荐
- 将java的集合转换为数据库集合类型 解决weblogic调用存储过程的时候,返回值乱码问题
- 关于asp调用oracle存储过程的问题
- 解决存储过程执行快,但程序调用则执行慢的问题
- 解决存储过程执行快,但程序调用则执行慢的问题
- 解决存储过程执行快,但程序调用则执行慢的问题
- 关于coolite grid 存储过程分页的问题,忘大虾解决...
- 解决java在调用存储过程中需要传递clob字段时存在问题
- 关于在 oracle trigger(insert)事件中调用存储过程的问题
- 关于JDBC使用命名参数(named parameters)进行存储过程调用的问题
- 运用ORACLE的OO4O类库函数解决调用存储过程向远程数据库上传超过32K图片失败的问题
- 关于 "java 如何调用Oracle存储过程中的动态refcursor结果集" 问题
- 最近在ArcGIS Engine开发中关于调用gp工具过程出现COM 组件的调用返回了错误 HRESULT E_FAIL 错误的解决方法 和 学习oracle中遇到的一些问题总结
- 关于在SQLSERVER2000中存储过程调用存储过程返回参数的问题
- 关于shell调用MySQL存储过程的问题
- 关于Oracle存储过程执行权限问题的解决
- 关于EF调用存储过程那点事...
- 解决多线程调用sql存储过程问题
- 解决存储过程执行快,但程序调用则执行慢的问题
- 解决存储过程执行快,但程序调用则执行慢的问题
- ADO.NET Entity Framework调用存储过程中碰到的问题