簡體   English   中英

INSERT存儲過程不起作用?

[英]INSERT stored procedure does not work?

我正在嘗試從一個名為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時則不行。 有人看到我的代碼有什么問題嗎?

謝謝

編輯:添加更多代碼。 它仍然無法改變,我的意思是,如果我執行它,程序是有效的,所以我不知道可能是什么錯誤。 事實上,我沒有得到任何錯誤。 可能是一個表中的寫入問題,而不是存儲過程的數據庫中的問題?

指定列名稱:

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

我會指定你的列名,而DONT則根據該列包含NULL。 讓SQL Server處理它。

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

當您嘗試從應用程序運行它時運行探查器,並查看它真正發送的值。 這將告訴您應用程序是否正在創建正確的exec語句來執行proc。

它也可能是權限問題。

“這可能是一個表中的寫入問題,而不是存儲過程的數據庫嗎?”

這可能是問題所在。 您可以嘗試將“WITH EXECUTE AS OWNER”子句添加到存儲過程,以便它作為存儲過程的所有者執行。 或者將執行用戶的寫權限授予表。

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

好吧,我終於找到了沒人意識到的事情。 這是一個非常愚蠢的錯誤,但在我發現問題之前讓我非常生氣。 這不是權限問題,問題是我沒有從我的應用程序執行該過程,所以我在這里寫道:

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

所以當你看到我把我的努力集中在更復雜的事情上時我甚至沒有執行它......哈哈。

無論如何,謝謝大家的回答:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM