向存储过程添加新参数
Adding new parameter to stored procedure
我的数据库中有一个存储过程,该过程当前接收并使用 11 个参数(所有参数都很好)。我需要为我添加的新列添加一个新参数。
我们总是在代码中明确定义我们的列,因此在 table 的末尾添加一列没有问题。但是,如果我在我的存储过程中添加一个新参数来填充这个新列,如果没有提供它是否会向我的 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 或空字符串,如果没有提供,我洗耳恭听。
您应该使用默认值,否则会出错
您可以继续使用 SP,只使用默认参数。 https://technet.microsoft.com/en-US/library/ms189330(v=SQL.105).aspx
@Filename varchar(50) = NULL --THIS IS NEW
I completely understand that this is a terrible use of a stored procedure.
呃,不是吗?当然,这是一个简单的存储过程,但是如果您的所有 SQL 都是存储过程,那么这就是要走的路。
I should be using Entity Framework [...]
编程中的事情并不总是最优的,你必须做你必须做的事情。
[...] if I add the new parameter "Filename" to the stored procedure before the new C# code above gets published, will I get an error, or will the SP simply default to NULL?
SQL 将抛出一个错误,表示新参数不是通过它的调用者提供的 (ASP.Net)。参见 here。
CREATE PROCEDURE Sales.uspGetSalesYTD
@SalesPerson nvarchar(50) = NULL -- NULL default value
AS
根据您的存储过程,它被认为是必需的。为避免被要求,您应该将以下内容添加到您的参数中:
@Filename varchar(50) = 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
......
我的数据库中有一个存储过程,该过程当前接收并使用 11 个参数(所有参数都很好)。我需要为我添加的新列添加一个新参数。
我们总是在代码中明确定义我们的列,因此在 table 的末尾添加一列没有问题。但是,如果我在我的存储过程中添加一个新参数来填充这个新列,如果没有提供它是否会向我的 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 或空字符串,如果没有提供,我洗耳恭听。
您应该使用默认值,否则会出错
您可以继续使用 SP,只使用默认参数。 https://technet.microsoft.com/en-US/library/ms189330(v=SQL.105).aspx
@Filename varchar(50) = NULL --THIS IS NEW
I completely understand that this is a terrible use of a stored procedure.
呃,不是吗?当然,这是一个简单的存储过程,但是如果您的所有 SQL 都是存储过程,那么这就是要走的路。
I should be using Entity Framework [...]
编程中的事情并不总是最优的,你必须做你必须做的事情。
[...] if I add the new parameter "Filename" to the stored procedure before the new C# code above gets published, will I get an error, or will the SP simply default to NULL?
SQL 将抛出一个错误,表示新参数不是通过它的调用者提供的 (ASP.Net)。参见 here。
CREATE PROCEDURE Sales.uspGetSalesYTD
@SalesPerson nvarchar(50) = NULL -- NULL default value
AS
根据您的存储过程,它被认为是必需的。为避免被要求,您应该将以下内容添加到您的参数中:
@Filename varchar(50) = 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
......