2013-09-24 5 views
1

В настоящее время я встретив такого рода ошибка«Ошибка преобразования» цифрового ввода для коррекции типа TSQL (возможная ошибка)

Ошибка преобразования типов данных с плавающей точкой в ​​десятичной системе.

или

Ошибка преобразования типа данных Numeric в десятичную

Это мой код

using (SqlConnection reportsConn = new SqlConnection(sqlConnWriter)) 
{ 
      reportsConn.Open(); 
      SqlCommand AddReconItem = new SqlCommand(); 
      AddReconItem.Connection = reportsConn; 
      AddReconItem.CommandType = CommandType.StoredProcedure; 
      AddReconItem.CommandText = "Updater.usp_AddReconcileItems"; 
      // AddReconItem.Parameters.Add("@varible",SqlDbType.Decimal 
      AddReconItem.Parameters.AddWithValue("@ITEMWEIGHT", Math.Round(Convert.ToDouble(WeightTextBox.Text+".00"), 2)); 
      AddReconItem.Parameters.AddWithValue("@ITEMPRINCIPALAMT", Math.Round(Convert.ToDouble(PrincipalTexAmTextBox.Text + ".00"), 2)); 
      AddReconItem.Parameters.AddWithValue("@FORLOANMONTH", Convert.ToDateTime(YearDropDownList.SelectedValue + "/" + MonthDropDownList.SelectedValue)); 
      AddReconItem.Parameters.AddWithValue("@STORAGEGROUPID", StorageNameDropDownList.SelectedValue); 
      AddReconItem.Parameters.AddWithValue("@BRANCHCODE",BranchCodeTextBox.Text); 
      AddReconItem.Parameters.AddWithValue("RECONID", ReconTypeDropDownList.SelectedValue); 
      AddReconItem.Parameters.AddWithValue("@PAWNTIX",PwnTicketTextBox.Text); 
      AddReconItem.Parameters.AddWithValue("@CREATEDBY", Session["UserID"].ToString()); 
      AddReconItem.ExecuteNonQuery(); 
} 

Когда вход, 123 для principalamt и itemweight она принимает ответ и рассматривает его как десятичную, но когда я в поставил 1234 для itemweight и еще 123 для Principalamt это показывает, что ошибка, если удалить преобразование и изменить его на Convert.ToDecimal он показывает Error converting data type Numeric to decimal, если я использую его в качестве текста он показывает Error converting data type varchar to decimal

Является ли это ошибка или что-то? Я не могу показаться, чтобы найти способ, которым я пытался много вариантов, но ни один из них работали

Мои столбцы базы данных ниже:

Я действительно надеюсь, что вы можете помочь мне понять это явление

EDIT
Это первый раз, когда программа принимала 123 в качестве действительного ввода, а 1234 - нет, моя база данных Decimal (38,6) очень большая, чтобы разместить этот вход, поэтому я ищу ответ или известные ошибки, которые могут решить эту проблему проблема, спасибо.

+0

Можете ли вы изолировать проблему от * just *, скажем, типа денег? (Будьте осторожны с термином «ошибка» или «ошибки» в заголовках или тегах - они должны быть зарезервированы для редких случаев утверждения проблемы с хорошо установленной программой/библиотекой :) – user2246674

+0

@ user2246674 нет проблем с типом денег я подозреваю проблему в десятичном типе. – user2705620

+0

@ user2246674 Это не редкий случай? я никогда не видел поток inoutting 123, поскольку он принимает его, в то время как 1234 не является принятым входом? – user2705620

ответ

0

Я бы предложил использовать Decimal.TryParse вместо Convert для вашего значения mainamt, а затем, возможно, отлаживать и проверять, как значение преобразуется в действительный столбец Decimal for your Money. Например, что-то вроде;

bool valid; 
var dbl = Convert.ToDouble("1234.00"); 
valid = Double.TryParse("1234.00", out dbl); 

var dcml = Convert.ToDecimal("1234.00"); 
valid = Decimal.TryParse("1234.00", out dcml); 

Я не уверен, если вы должны использовать Double как тип данных при попытке сохранить результирующее значение в десятичном поле. Double представляет числа с плавающим типом, и я думаю, что вы должны использовать тип данных Decimal для своего денежного столбца, как указано в this answer.

Для ItemWeight, с типом данных десятичной (38,6), вы получите 6 десятичных знаков независимо от вашего округления, я думаю. Попробуйте следующее в SQL Server и убедитесь, что тип параметра для @ITEMPRINCIPALAMT также является DECIMAL (аналогично моему примеру ниже).

DECLARE @Var decimal(38,6) = 1234.00 

DECLARE @Tbl AS TABLE 
(
    Test decimal(38,6) 
) 

INSERT INTO @Tbl (Test) Values (@Var) 

SELECT * FROM @Tbl 
Смежные вопросы