INSERT存储过程不起作用?

时间:2010-05-18 13:49:39

标签: asp.net sql asp.net-mvc stored-procedures

我正在尝试从一个名为suspension的数据库插入到Animals数据库中名为Notification的表中。我的存储过程是这样的:

       ALTER PROCEDURE [dbo].[spCreateNotification] 
        -- Add the parameters for the stored procedure here
        @notRecID int,
        @notName nvarchar(50),
        @notRecStatus nvarchar(1),
        @notAdded smalldatetime,
        @notByWho int
    AS
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;

        -- Insert statements for procedure here
        INSERT INTO Animals.dbo.Notification 
(
NotRecID, 
NotName, 
NotRecStatus, 
NotAdded, 
NotByWho
)
values (@notRecID, @notName, @notRecStatus, @notAdded, @notByWho);
    END

空插入是为了补充一个否则不会被填充的列,我尝试了不同的方法,比如使用表名后面的列的名称,然后只在值中指出我已经填写的字段拿到。我知道这不是存储过程的问题,因为我是从sql server管理工作室执行的,它引入了参数。然后我想当我调用存储过程时问题必须在存储库中:

public void createNotification(Notification not)
        {
            try
            {
                DB.spCreateNotification(not.NotRecID, not.NotName, not.NotRecStatus,
                                        (DateTime)not.NotAdded, (int)not.NotByWho);

            }
            catch
            {
                return;
            }
        }

我在这里调用方法:

public void createNotifications(IList<TemporalNotification> notifications)
        {

            foreach (var TNot in notifications)
            {
                var ts = RepositoryService._suspension.getTemporalSuspensionForNotificationID(TNot.TNotRecID);
                Notification notification = new Notification();
                if (ts.Count != 0)
                {
                    notification.NotName = TNot.TNotName;
                    notification.NotRecID = TNot.TNotRecID;
                    notification.NotRecStatus = TNot.TNotRecStatus;
                    notification.NotAdded = TNot.TNotAdded;
                    notification.NotByWho = TNot.TNotByWho;

                    if (TNot.TNotToReplace != 0)
                    {
                        var suspensions = RepositoryService._suspension.getSuspensionsAttached((int)TNot.TNotToReplace);
                        foreach (var sus in suspensions)
                        {
                            sus.CtsEndDate = TNot.TNotAdded;
                            sus.CtsEndNotRecID = TNot.TNotRecID;
                            DB.spModifySuspensionWhenNotificationIsReplaced((int)TNot.TNotToReplace, (int)sus.CtsEndNotRecID, (DateTime) sus.CtsEndDate);
                        }
                        DB.spReplaceNotification((int)TNot.TNotToReplace, DateTime.Now);
                        createNotification(notification);
                    }
                    else
                    {
                        createNotification(notification);
                    }
                }
            }
            deleteTemporalNotifications(notifications);
        }

它不会记录数据库中的值。我一直在调试并对此感到生气,因为它在我手动执行时起作用,但在我的应用程序中自动化proccess时则不行。有人看到我的代码有什么问题吗?

谢谢

编辑:添加了更多代码。它仍然无法改变,我的意思是,如果我执行它,程序是有效的,所以我不知道可能是什么错误。事实上,我没有得到任何错误。这可能是一个表中的写入问题,而这个表中没有存储过程的数据库吗?

5 个答案:

答案 0 :(得分:3)

指定列名:

INSERT INTO Animals.dbo.Notification 
(RecID, Name, RecStatus, Added, ByWho)
VALUES 
(@notRecID, @notName, @notRecStatus, @notAdded, @notByWho);

答案 1 :(得分:3)

我会指定您的列名称, DONT 包含该列的所有NULL。让SQL Server处理它。

INSERT INTO Animals.dbo.Notification
(
 RecID,
 [Name],
 RecStatus,
 Added,
 ByWho 
)
values (@notRecID, @notName, @notRecStatus, @notAdded, @notByWho); 

答案 2 :(得分:3)

尝试从应用程序运行它时运行探查器,并查看它真正发送的值。这将告诉您应用程序是否正在创建正确的exec语句来执行proc。

也可能是权限问题。

答案 3 :(得分:1)

“这可能是一个表中没有存储过程的数据库中的写入问题吗?”

这可能是问题所在。您可以尝试将“WITH EXECUTE AS OWNER”子句添加到存储过程,以便它作为存储过程的所有者执行。或者将执行用户的写权限授予表。

http://msdn.microsoft.com/en-us/library/ms188354.aspx

答案 4 :(得分:0)

好吧,我终于找到了没人意识到的事情。这是一个非常愚蠢的错误,但在我发现问题之前让我非常生气。这不是权限问题,问题是我没有从我的应用程序执行该过程,所以在那里写了这个:

DB.spCreateNotification(not.NotRecID, not.NotName, not.NotRecStatus,
                                        (DateTime)not.NotAdded, (int)not.NotByWho);

当我不得不写:

DB.spCreateNotification(not.NotRecID, not.NotName, not.NotRecStatus,
                                        (DateTime)not.NotAdded, (int)not.NotByWho).Execute();

所以当你看到我把我的努力集中在更复杂的事情上时我甚至没有执行它......哈哈。

无论如何,谢谢大家的答案:)