簡體   English   中英

將新參數添加到存儲過程

[英]Adding new parameter to stored procedure

我的數據庫中有一個存儲過程,當前接收並使用了11個參數(一切正常)。 我需要為我添加的新列添加一個新參數。

我們總是在代碼中明確定義列,因此在表的末尾添加列沒有問題。 但是,如果我在我的存儲過程中添加一個新參數來填充這個新列,如果它沒有提供,它會將錯誤返回給我的C#代碼,還是默認為參數的null(或其他值) ?

示例C#代碼調用存儲過程:

public static void InsertMailLog(string messageId, DateTime sentOrReceivedDate,
        string fromAddress, string toAddress, string subject, string receivedMessage, string tailNumber,
        string messageType, string direction, string sentOrReceived, string distributionList, ILogger AppEventLog, string filename = null)
{
        List<string> lstParameterValues = new List<string>();

        try
        {
            lstParameterValues.Add(messageId ?? "");
            lstParameterValues.Add(sentOrReceivedDate.ToString("yyyy-MM-dd HH:mm:ss.fff"));
            lstParameterValues.Add(fromAddress ?? "");
            lstParameterValues.Add(toAddress);
            lstParameterValues.Add(subject ?? "");
            lstParameterValues.Add(receivedMessage ?? "");
            lstParameterValues.Add(tailNumber ?? "");
            lstParameterValues.Add(messageType ?? "");
            lstParameterValues.Add(direction ?? "");
            lstParameterValues.Add(sentOrReceived ?? "");
            lstParameterValues.Add(distributionList ?? "");
            lstParameterValues.Add(filename ?? "");  //THIS IS NEW, but it has not been published yet as the SP hasn't been updated.

            CommonDAL.ExecSpNonQuery("spMailLogInsert", lstParameterValues);
        }
        catch (Exception ex)
        {
            CommonBLL.LogError(ex, MethodBase.GetCurrentMethod().DeclaringType.Name, MethodBase.GetCurrentMethod().Name, "Error", messageId, tailNumber, messageType, "", Settings.Default.ContentProvider, AppEventLog);
        }
    }

示例存儲過程代碼:

ALTER PROCEDURE [dbo].[spMailLogInsert]
    @SdMessageId         varchar(50),
    @SentOrReceivedDate  datetime,
    @FromAddress         varchar(100),
    @ToAddress           varchar(100),
    @Subject             varchar(255),
    @Message             varchar(MAX),
    @TailNumber          varchar(50),   
    @MessageType         varchar(50),
    @Direction           varchar(50),
    @SentOrReceived      varchar(50),
    @DistributionList    varchar(50),
    @Filename            varchar(50)  --THIS IS NEW
AS
    SET NOCOUNT ON

    INSERT MailLog (SdMessageId, SentOrReceivedDate, FromAddress, ToAddress,
                    [Subject], [Message], TailNumber, MessageType, Direction,
                    SentOrReceived, DistributionList, Filename  --THIS IS NEW
                   ) 
    VALUES (@SdMessageId, @SentOrReceivedDate, @FromAddress, @ToAddress,
            @Subject, @Message, @TailNumber, @MessageType,
            @Direction, @SentOrReceived, @DistributionList,
            @Filename  --THIS IS NEW
           )

我完全理解這是對存儲過程的可怕使用。 我應該使用Entity Framework,但它已經編寫了,我有一個項目來更新整個項目以便在以后的DAL中使用EF(這是非常古老的代碼)。

我的問題是,如果我在上面的新C#代碼發布之前將新參數@Filename “添加到存儲過程中,我是否會收到錯誤,或者存儲過程參數是否默認為NULL?或者,如果有人有更好的將此默認為NULL或空字符串的方法,如果沒有提供,我都是耳朵。

要么讓它像這樣可以為空。

    ALTER PROCEDURE [dbo].[spMailLogInsert]
    @SdMessageId         varchar(50),
    @SentOrReceivedDate  datetime,
    @FromAddress         varchar(100),
    @ToAddress           varchar(100),
    @Subject             varchar(255),
    @Message             varchar(MAX),
    @TailNumber          varchar(50),   
    @MessageType         varchar(50),
    @Direction           varchar(50),
    @SentOrReceived      varchar(50),
    @DistributionList    varchar(50),
    @Filename            varchar(50) = NULL --THIS IS NEW
......

或者像這樣添加默認值:

    ALTER PROCEDURE [dbo].[spMailLogInsert]
    @SdMessageId         varchar(50),
    @SentOrReceivedDate  datetime,
    @FromAddress         varchar(100),
    @ToAddress           varchar(100),
    @Subject             varchar(255),
    @Message             varchar(MAX),
    @TailNumber          varchar(50),   
    @MessageType         varchar(50),
    @Direction           varchar(50),
    @SentOrReceived      varchar(50),
    @DistributionList    varchar(50),
    @Filename            varchar(50) = 'abc.txt' --THIS IS NEW
......

您可以繼續使用SP並使用默認參數。 https://technet.microsoft.com/en-US/library/ms189330(v=SQL.105).aspx

@Filename            varchar(50) = NULL  --THIS IS NEW

我完全理解這是對存儲過程的可怕使用。

呃沒有? 這是一個簡單的sproc,當然,如果你的所有SQL都是sprocs,那么這就是你要走的路。

我應該使用實體框架[...]

編程中的事情並不總是最優的,你必須做你必須做的事情。

[...]如果我在上面的新C#代碼發布之前將新參數“Filename”添加到存儲過程中,我是否會收到錯誤,或者SP是否會默認為NULL?

SQL將拋出一個錯誤,即新參數不是通過它的調用者(ASP.Net)提供的。 看到這里

CREATE PROCEDURE Sales.uspGetSalesYTD
    @SalesPerson nvarchar(50) = NULL  -- NULL default value
AS 

根據您的存儲過程,它被認為是必需的 為避免出現這種情況,您應該在參數中添加以下內容:

@Filename varchar(50) = null

這將使它成為可選項,這將允許您避免代碼中的過多Null檢查。 這可以讓您的代碼快速轉向意大利面。 這將是解決您問題的最簡單,最不具侵入性的方法。

您應該使用默認值,否則會出錯

暫無
暫無

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

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