Распределение несоответствий при перемещении данных из пользовательского интерфейса в базу данных (C# на SQL сервер, с плавающего? На плавающий) - PullRequest
0 голосов
/ 16 января 2020

У меня есть простая SQL Серверная хранимая процедура, которая обновляет мои расходы на утилиты на основе столбца Utility Id, предоставленного для поиска.

Когда я вызываю эту хранимую процедуру из C#, я использую следующую код. База данных заканчивается данными, немного отличающимися от фактической стоимости.

Например, если стоимость равна 123, я мог бы получить 123,000000048204

Когда я ставлю свою точку останова в коде, я нахожу что U.CostMonthCal[1] имеет правильное значение (например, 123). U.CostMOnthCal[1] имеет тип float?.

Так что я разыграл его как float. Код работает нормально.

Но 123 преобразуется в 123.00000000xxxx, когда попадает в базу данных.

Он делает это для всех моих столбцов, но вам не нужно смотреть на весь код.

Просто сфокусируйтесь на первом столбце, CostMonthCal1. В базе данных тип столбца float (хотя я думаю, что, возможно, я смогу преобразовать его в реальный, и это также сэкономит место ... Я собираюсь попробовать это, чтобы посмотреть, решит ли это мою проблему).

    public static void UpdateUtilityCosts(clsUtility U)
    {
        SqlConnection connection = null;

        try
        {
            connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DbConn"].ToString());
            connection.Open();
            SqlCommand com;

            com = new SqlCommand("dbo.UpdateUtilityCosts", connection);
            com.CommandType = CommandType.StoredProcedure;
            com.Parameters.Add(new SqlParameter("@UtilityId", U.UtilityId));

            if (U.CostMonthCal[1] is null) { }  else { com.Parameters.Add(new SqlParameter("@CostMonthCal1", (float) U.CostMonthCal[1])); }
            if (U.CostMonthCal[2] is null) { } else { com.Parameters.Add(new SqlParameter("@CostMonthCal2", (float)U.CostMonthCal[2])); }
            if (U.CostMonthCal[3] is null) { } else { com.Parameters.Add(new SqlParameter("@CostMonthCal3", (float)U.CostMonthCal[3])); }
            if (U.CostMonthCal[4] is null) { } else { com.Parameters.Add(new SqlParameter("@CostMonthCal4", (float)U.CostMonthCal[4])); }
            if (U.CostMonthCal[5] is null) { } else { com.Parameters.Add(new SqlParameter("@CostMonthCal5", (float)U.CostMonthCal[5])); }
            if (U.CostMonthCal[6] is null) { } else { com.Parameters.Add(new SqlParameter("@CostMonthCal6", (float)U.CostMonthCal[6])); }
            if (U.CostMonthCal[7] is null) { } else { com.Parameters.Add(new SqlParameter("@CostMonthCal7", (float)U.CostMonthCal[7])); }
            if (U.CostMonthCal[8] is null) { } else { com.Parameters.Add(new SqlParameter("@CostMonthCal8", (float)U.CostMonthCal[8])); }
            if (U.CostMonthCal[9] is null) { } else { com.Parameters.Add(new SqlParameter("@CostMonthCal9", (float)U.CostMonthCal[9])); }
            if (U.CostMonthCal[10] is null) { } else { com.Parameters.Add(new SqlParameter("@CostMonthCal10", (float)U.CostMonthCal[10])); }
            if (U.CostMonthCal[11] is null) { } else { com.Parameters.Add(new SqlParameter("@CostMonthCal11", (float)U.CostMonthCal[11])); }
            if (U.CostMonthCal[12] is null) { } else { com.Parameters.Add(new SqlParameter("@CostMonthCal12", (float)U.CostMonthCal[12])); }
            if (U.LineLossPct is null) { } else { com.Parameters.Add(new SqlParameter("@LineLossPct", (float)U.LineLossPct)); }
            if (U.GRT is null) { } else { com.Parameters.Add(new SqlParameter("@GRT", (float)U.GRT)); }
            if (U.POR is null) { } else { com.Parameters.Add(new SqlParameter("@POR", (float)U.POR)); }

            if (U._12MonthCaps is null) { } else { com.Parameters.Add(new SqlParameter("@12MonthCaps", (float)U._12MonthCaps)); }
            if (U._12MonthNits is null) { } else { com.Parameters.Add(new SqlParameter("@12MonthNits", (float)U._12MonthNits)); }
            if (U._12MonthRate is null) { } else { com.Parameters.Add(new SqlParameter("@12MonthRate", (float)U._12MonthRate)); }

            if (U.NonPolarCTA is null) { } else { com.Parameters.Add(new SqlParameter("@NonPolarCTA", (float)U.NonPolarCTA)); }
            if (U.PolarCTA is null) { } else { com.Parameters.Add(new SqlParameter("@PolarCTA", (float)U.PolarCTA)); }

            if (com.Connection.State == ConnectionState.Closed) 
                com.Connection.Open();

            com.ExecuteNonQuery();
        }
        catch (Exception e)
        {
            string Msg;
            Msg = "Encountered unexpected program issue.  Please contact your program administator.  Error details...";
            Msg = Msg + System.Environment.NewLine;
            Msg = Msg + System.Environment.NewLine;
            Msg = Msg + e.ToString();
            Msg = Msg + System.Environment.NewLine;
            Msg = Msg + System.Environment.NewLine;
            Msg = Msg + e.Message;

            throw new Exception("Error Saving Cost Data.  Contact Program Administrator " + Msg);
        }
        finally
        {
            if (connection == null) { } else connection.Dispose();
        }
    }

А вот и хранимая процедура:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[UpdateUtilityCosts] 
    (@UtilityId int = null, 
     @CostMonthCal1 float = null, 
     @CostMonthCal2 float = null, 
     @CostMonthCal3 float = null, 
     @CostMonthCal4 float = null, 
     @CostMonthCal5 float = null, 
     @CostMonthCal6 float = null, 
     @CostMonthCal7 float = null, 
     @CostMonthCal8 float = null, 
     @CostMonthCal9 float = null, 
     @CostMonthCal10 float = null, 
     @CostMonthCal11 float = null, 
     @CostMonthCal12 float = null,
     @LineLossPct float = null,
     @GRT float = null,
     @POR float = null,
     @12MonthCaps float = null,
     @12MonthNits float = null,
     @12MonthRate float = null,
     @NonPolarCTA float = null,
     @PolarCTA float = null)
as
begin
    update Utilities 
    set CostMonth1 = @CostMonthCal1, 
        CostMonth2 = @CostMonthCal2, 
        CostMonth3 = @CostMonthCal3, 
        CostMonth4 = @CostMonthCal4, 
        CostMonth5 = @CostMonthCal5, 
        CostMonth6 = @CostMonthCal6, 
        CostMonth7 = @CostMonthCal7, 
        CostMonth8 = @CostMonthCal8, 
        CostMonth9 = @CostMonthCal9, 
        CostMonth10 = @CostMonthCal10, 
        CostMonth11 = @CostMonthCal11, 
        CostMonth12 = @CostMonthCal12,
        LineLossPct = @LineLossPct,
        GRT = @GRT,
        POR = @POR,
        [12MonthCaps] = @12MonthCaps,
        [12MonthNits] = @12MonthNits,
        [12MonthRate] = @12MonthRate,
        NonPolarCTA = @NonPolarCTA,
        PolarCTA = @PolarCTA
    where UtilityId =  @UtilityId
end
GO

1 Ответ

0 голосов
/ 29 января 2020

Использование десятичного числа в коде и любого десятичного (m, n) типа в базе данных, кажется, работает, согласно комментариям выше. Но никто не отправил в качестве ответа, поэтому здесь я go ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...