【问题标题】:INSERT stored procedure does not work?INSERT 存储过程不起作用?
【发布时间】:2011-02-20 22:01:45
【问题描述】:

我正在尝试从一个名为suspend 的数据库插入到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 management studio 执行的,它可以引入参数。那么我猜想问题一定出在我调用存储过程的时候:

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);
        }

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

谢谢

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

【问题讨论】:

  • 当你单步执行代码时,它真的到达调用过程的地步了吗?
  • 是的,它会穿过它,好像什么都没有。调用后我检查表,数据库中没有任何反应。我不知道还能尝试什么,从来没有这么卡住过哈哈
  • 您是否更改了程序以枚举 INSERT 子句中的列?
  • 您是否尝试过在 .NET 代码调用过程时运行 SQL Profiler 以查看它传递给存储过程的确切内容?
  • @Thomas - 是的,我改变了它,我没有编辑但我改变了 sql 查询

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


【解决方案1】:

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

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();

所以如你所见,我将精力集中在更复杂的事情上,而我什至没有执行它......哈哈。

还是谢谢大家的回答:)

【讨论】:

    【解决方案2】:

    “这可能是写在一个表中的问题,而该表不在您拥有存储过程的数据库中吗?”

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

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

    【讨论】:

      【解决方案3】:

      指定列名:

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

      【讨论】:

      • 我会忽略空值。由于它不是必需的,当 SQL 服务器没有从插入查询中获取值时,它会填写 NULL
      【解决方案4】:

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

      也可能是权限问题。

      【讨论】:

      • 我想我没有安装探查器。我试图搜索另一个,但不知道如何使用它,我会继续搜索。万一是权限问题,是不是会失败并报错?
      • 安装 Profiler。如果您学会使用它,它可以为您节省数小时的头撞。
      【解决方案5】:

      我会指定您的列名,并且 DONT 包括该列的 NULL。让 SQL Server 来处理吧。

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

      【讨论】:

      • 你为什么要把这个括号放在名字里?它们有什么特殊含义吗?
      • [Name] 不需要。但是,无论何时使用关键字,都应将其括在方括号中,以便查询处理器可以更好地将其识别为列。请参阅msdn.microsoft.com/en-us/library/ms189822.aspx 获取列表。
      • 谢谢,但对我来说这不是问题。我编辑了帖子以显示我所拥有的内容,以防有人注意到错误。我一直在尝试不同的事情,但直到现在都没有成功。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多