2013-04-12 4 views
1

я следующий хранимые процедуры определены:рамки Entity хранимой процедура вопрос

USE [BcmMetrice] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[ActivityAdd_proc] @Name nvarchar(max),@Description nvarchar(max) =null ,@Users nvarchar(max),@Object_id nvarchar (15) =null, @Source nvarchar(10) =null, @TemplateId bigint =null, @UserID bigint =null 
AS 


DECLARE activityUsers_cursor CURSOR FOR 
select s from dbo.SplitString(@Users, ';') 


DECLARE 
@new_ActivityId bigint, 
@new_CommentId bigint, 
@activityUser_l bigint 

BEGIN TRY 

INSERT INTO [BcmMetrice].[dbo].[Activity] 
      ([Name] 
      ,[Description] 
      ,[Type] 
      ,[Created]) 
    VALUES 
      (@Name 
      ,@Description 
      ,ISNULL(@TemplateId,0) 
      ,GETDATE()) 

SET @new_ActivityId = (SELECT SCOPE_IDENTITY()) 

INSERT INTO [BcmMetrice].[dbo].[Comment] ([UserID],[CommentText],[Timestamp]) 
VALUES (ISNULL(@UserID,151),'Activity has been created',GETDATE()) 

SET @new_CommentId = (SELECT SCOPE_IDENTITY()) 

INSERT INTO [BcmMetrice].[dbo].[ActivityComment] ([ActivityID],[CommentID]) 
VALUES (@new_ActivityId, @new_CommentId) 

INSERT INTO [BcmMetrice].[dbo].[Log]([Timestamp],[Type],[Data],[StackTrace]) VALUES (GETDATE(),'SQL.ActivityAdd_proc','users='+ISNULL(CAST(@Users as varchar(max)),'empty'),null) 

OPEN activityUsers_cursor 
FETCH NEXT FROM activityUsers_cursor INTO @activityUser_l 
WHILE @@FETCH_STATUS = 0 
    BEGIN 

     INSERT INTO [BcmMetrice].[dbo].[Log]([Timestamp],[Type],[Data],[StackTrace]) VALUES (GETDATE(),'SQL.ActivityAdd_proc','Inserting users='+ISNULL(CAST(@activityUser_l as varchar(max)),'empty'),null) 

     INSERT INTO [BcmMetrice].[dbo].[ActivityUser] 
       ([ActivityId] 
       ,[UserId] 
       ,[Role]) 
     VALUES 
       (@new_ActivityId 
       ,@activityUser_l 
       ,1) 

     FETCH NEXT FROM activityUsers_cursor INTO @activityUser_l 
    END 

CLOSE activityUsers_cursor 
DEALLOCATE activityUsers_cursor 

END TRY 

BEGIN CATCH 

PRINT 'ERROR' 
INSERT INTO [BcmMetrice].[dbo].[Log]([Timestamp],[Type],[Data],[StackTrace]) VALUES (GETDATE(),'SQL.ActivityAdd_proc','ERROR CATCHED!'+ERROR_MESSAGE(),null) 


END CATCH 

select @new_ActivityId 

То, что я хотел бы сделать, это вернуться из процедуры идентификатор вновь добавленной деятельности. Вот почему в очень и я использую строку:

select @new_ActivityId 

При тестировании этой процедуры в SQL Management Studio все, кажется, работает хорошо. Проблема начинается, когда я пытаюсь использовать эту процедуру в своем проекте .NET. Я обновил базу данных формы модели edmx, но при выполнении этой процедуры возвращаемое значение недействительно.

исполнение Процедура выглядит следующим образом:

int ret = dc.Db.ActivityAdd_proc(name, description, users, object_id, source, templateId, userId); 

Кто-нибудь есть идея, что я могу делать неправильно?

ответ

1

Я нашел решение своей проблемы. Когда вы пытаетесь вернуть данные из хранимой процедуры с помощью оператора select, вы должны создать функцию Import в браузере моделей edmx. В мастере вы выбираете тип возвращаемой коллекции (в моем случае это был скаляр типа int64).