Я постараюсь ответить на ваш вопрос, будет ли это работать для вас, зависит от вашей конечной цели и требований ваших приложений.
Комментарии были добавлены в код, где явнесены изменения.
Сначала я добавил новый параметр SQL @datecompleted
со значением по умолчанию NULL.Это позволит вам исключить его при вызове sproc из C # и продолжать использовать существующую логику SQL при необходимости.
Во-вторых, я добавил вызов COALESCE
, чтобы использовать значение @datecompleted
, если оно неNULL или вызовите функцию fnc_getdatelocal
, как она уже делает, если она NULL.
SQL:
ALTER PROCEDURE [dbo].[usp_load_status_update]
@id INT = 0,
@statusname VARCHAR(128) = '',
@loginname VARCHAR(512),
@datecompleted DATETIME = NULL -- Added new SQL parameter for date completed input from C#
AS
BEGIN
SET NOCOUNT ON;
-- Set the @today variable to use the @datecompleted paramter if it's not null otherwise use date from the fnc_getdatelocal() function
DECLARE @today DATETIME = COALESCE(@datecompleted,[dbo].[fnc_getdatelocal]())
-- Depending on the locality of the @datecompleted parameter and your application's requirements,
-- you will need to figure out the best way for your process to convert to locality used by the fnc_getdatelocal function
-- Does your function accept a parameter, if so you may be able to pass the @datecompleted parameter to it, e.g. DECLARE @today DATETIME = COALESCE(@datecompleted,[dbo].[fnc_getdatelocal](@datecompleted))
DECLARE @statusid INT
DECLARE @oldstatusid INT
DECLARE @olddriverid INT
SELECT @statusid = [id]
FROM [LoadStatus]
WHERE [name] = @statusname
SELECT @oldstatusid = [statusid], @olddriverid = [driverid]
FROM [Load]
WHERE [id] = @id
-- update status, and reset driverid to null if it is back to pending
UPDATE [Load]
SET [statusid] = ISNULL(@statusid, 0),
[driverid] = CASE
WHEN ISNULL(@statusid, 0) = 0
THEN NULL
ELSE [driverid]
END
WHERE [id] = @id
--kludge for now, need to update status on each row in the future
UPDATE [LoadContact]
SET [statusid] = IsNull(@statusid, 0),
[completiondt] = CASE
WHEN [instancetype] = 1
AND ISNULL(@oldstatusid, 0) < 3
AND ISNULL(@statusid, 0) >= 3
THEN @today
WHEN [instancetype] = 2
AND ISNULL(@oldstatusid, 0) < 4
AND ISNULL(@statusid, 0) >= 4
THEN @today
ELSE [completiondt]
END
WHERE [loadid] = @id
--kludge for now, need to update order invoice status separately
IF (ISNULL(@statusid, 0) >= 8)
BEGIN
UPDATE [Invoice]
SET [statusid] = 8
WHERE [orderid] = @id
UPDATE [Bill]
SET [statusid] = 8
WHERE [loadid] = @id
END
C #:
Я изменил вашТип переменной currentDate
, позволяющий ему быть нулевым.Это может быть полезно, если вы не всегда хотите отправлять его в своем вызове SQL, а вместо этого используете существующую логику, как сегодня.Я считаю, что элемент управления ASPxDateEdit
может иметь дату null
, если он настроен для него.Это действительно зависит от ваших требований.
protected void editDeliveredDate_DateChanged(object sender, EventArgs e)
{
ASPxDateEdit dateEdit = sender as ASPxDateEdit;
// I made your currentDate variable to be nullable
DateTime? currentDate = dateEdit.Date;
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ACAOSBConnectionString"].ToString()))
{
string ordstr = (txt_orderid.Text != null) ? txt_orderid.Text : string.Empty;
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "usp_load_status_update";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@id", SqlDbType.Int).Value = ordstr.ToString();
cmd.Parameters.Add("@loginname", SqlDbType.VarChar, 512).Value = Page.User.Identity.Name;
if(currentDate != null)
{
// only set the parameter if it's not null, this will allow the SQL sproc to use its existing logic
cmd.Parameters.Add("@datecompleted", SqlDbType.DateTime).Value = currentDate;
}
try
{
conn.Open();
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
//TODO: save log for now;
int ex_errorid = 0;
string ex_msg = string.Concat((ex != null && ex.Message != null) ? ex.Message.ToString() : (ex != null && ex.InnerException != null) ? ex.InnerException.ToString() : "No Message Found ", (ex != null && ex.StackTrace != null) ? ex.StackTrace.ToString() : "No Strack Trace ");
int ex_genericid = 0;
string ex_username = (Page != null && Page.User != null && Page.User.Identity != null && Page.User.Identity.Name != null) ? Page.User.Identity.Name : "No user found";
Jobs.log_somewhere ex_errorlog = new Jobs.log_somewhere();
ex_errorlog.log_secos_error(ex_errorid, ex_msg, ex_genericid, ex_username);
}
}
}