ADO.NET Entity Framework 研究过程中遇到的问题

本文探讨了ADO.NET Entity Framework中调用存储过程的问题,包括返回非实体类型的存储过程调用方法及返回实体类型存储过程的正确实现方式。

ADO.NET Entity Framework 是.Net Framework 3.5 SP1 引入的实体框架


         问题:1、没有批量添加、删除的方法,Linq To SQL是有的。
               2、调用存储过程:如果导入的函数返回值类型不是entity,则代码会生成到Model1.edmx中,不知如何调用?
                                如果导入返回值类型是entity,代码会生成到Model1.Designer.cs中,但执行完添加后报错,“数据读取器与指定的“rzeamtestModel.MM_BJ”不兼容。某个类型为“ID”的成员在同名的数据读取器中没有对应的列。”

 

更新:

1、关于导入函数返回值类型不是entity(为空或标量)的存储过程调用:

        /// <summary>
        /// 存储过程添加
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            EntityParameter[] param = {                             
                                      new EntityParameter("BJBM",DbType.String),
                                      new EntityParameter("BJMC",DbType.String),
                                      new EntityParameter("XHGG", DbType.String)
                                          };
            param[0].Value = "0002";
            param[1].Value = "键盘1";
            param[2].Value = "罗技";

            ExecuteFunction("INSERTMM_BJ", param);

            LoadData();
        }

        public void ExecuteFunction(string functionName, System.Data.EntityClient.EntityParameter[] parameters)
        {
            EntityCommand comm = new EntityCommand();
            comm.CommandType = CommandType.StoredProcedure;
            comm.Connection = (EntityConnection)db.Connection;
            comm.Parameters.AddRange(parameters);
            comm.CommandText = db.DefaultContainerName + "." + functionName;
            try
            {
                if (comm.Connection.State != System.Data.ConnectionState.Open)
                    comm.Connection.Open();
                var obj = comm.ExecuteNonQuery();
            }
            catch (System.Exception)
            {
                throw;
            }
            finally
            {
                comm.Connection.Close();
            }
        }

 

2、关于“数据读取器与指定的“rzeamtestModel.MM_BJ”不兼容。某个类型为“BJBM”的成员在同名的数据读取器中没有对应的列。”此错误,需要改造下存储过程,增加SELECT语句:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[USP_INSERTMM_BJ]
(@BJBM nvarchar(50),
@BJMC nvarchar(50),
@XHGG nvarchar(50),
@ID INT OUT)

AS

INSERT  MM_BJ VALUES  (@BJBM,@BJMC,@XHGG);

SET @ID=@@IDENTITY;

SELECT ID ,BJBM,BJMC,XHGG FROM MM_BJ WHERE ID=@ID;
--SELECT ID FROM MM_BJ WHERE ID=@ID;

 

如果想调用有返回值的函数,那么对应的存储过程中就必须有SELECT查询语句,且返回值中包含的列在SELECT中必须存在!注意此处用OUT参数的形式返回不行,必须用SELECT!

        /// <summary>
        /// 存储过程导入函数(返回值为实体)调用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

       private void button5_Click(object sender, EventArgs e)
        {

     rzeamtestEntities db = new rzeamtestEntities();
            ObjectParameter paraID = new ObjectParameter("ID", DbType.Int32);
            db.INSERTMM_BJReturn("0003", "鼠标", "罗技", paraID);

            LoadData();
        }

 

转载于:https://www.cnblogs.com/masterfy/archive/2009/08/24/1553234.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值