Хранимая процедура без параметров для обновления таблицы базы данных - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть эта хранимая процедура, которая имеет некоторые параметры, но столбец, который мне нужно использовать, не является параметром, и мне нужно обновить его при изменении даты, которую я использую с помощью средства выбора даты.Я не уверен, как вызвать это в C # поле, которое мне нужно использовать, называется [completiondt].

ALTER PROCEDURE [dbo].[usp_load_status_update]
    @id INT = 0,
    @statusname VARCHAR(128) = '',
    @loginname VARCHAR(512)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @today DATETIME = [dbo].[fnc_getdatelocal]()
    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 # код:

protected void editDeliveredDate_DateChanged(object sender, EventArgs e)
{
        ASPxDateEdit dateEdit = sender as ASPxDateEdit;
        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;

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

Как только я это выясню, это будетбыть равным currentDate.

1 Ответ

0 голосов
/ 26 сентября 2019

Я постараюсь ответить на ваш вопрос, будет ли это работать для вас, зависит от вашей конечной цели и требований ваших приложений.

Комментарии были добавлены в код, где явнесены изменения.


Сначала я добавил новый параметр 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...