У меня есть простая 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