При выполнении масштабной копии я получил следующую ошибку.
System.InvalidOperationException
The given value of type String from the data source cannot be converted to
type decimal of the specified target column.
Я использую следующий код.
DataTable empTable = DataTemplate.GetEmployees();
DataRow row;
for (int i = 0; i < gv.Rows.Count;i++ )
{
row = empTable.NewRow();
string empName = gv.DataKeys[i].Values[0].ToString(); //first key
string hourSalary = gv.DataKeys[i].Values[1].ToString(); //second key
row["Emp_Name"] = empName;
row["Hour_Salary"] = Convert.ToDecimal(hourSalary);
row["Advance_amount"] = Convert.ToDecimal(0);
row["Created_Date"] = Convert.ToDateTime(System.DateTime.Now.ToString());
row["Created_By"] = Convert.ToInt64(1);
row["Is_Deleted"] = Convert.ToInt64(0);
empTable.Rows.Add(row);
}
InsertintoEmployees(empTable, "Employee");
Мои типы данных SQL для вышеуказанных полей:
Emp_Name nvarchar(50) ,
Hour_Salary numeric(18, 2),
Advance_amount numeric(18, 2),
Created_Date datetime,
Created_By numeric(18, 0),
Is_Deleted numeric(18, 0)
Я не знаю, что я делаю неправильно.
Ваша переменная hourSalary - это строка, которую вы позже пытаетесь преобразовать в десятичный, и это не удается.
Скорее всего, у вас либо пустое строковое значение, либо недопустимое значение.
В зависимости от ваших требований вы должны решить, что делать с недопустимым значением. В основном у вас есть два варианта, кроме сбой: сохранить как значение по умолчанию (возможно, 0?) Или сохранить как значение Null.
Если вы хотите сохранить значение по умолчанию, вы можете попробовать следующее при конвертации зарплаты:
string hourSalary = gv.DataKeys[i].Values[1].ToString();
double salary = 0;
if (!double.TryParse(hourSalary, out salary))
{
salary = 0; // Set your default value here
}
row["Hour_Salary"] = salary;
Это гарантирует, что вы получите действительное десятичное значение, сохраненное в столбце Hour_Salary.
Если вы хотите сохранить нулевое значение, вы должны немного изменить код:
string hourSalary = gv.DataKeys[i].Values[1].ToString();
double salary;
object salaryValue;
if (double.TryParse(hourSalary, out salary))
{
salaryValue = salary;
}
else
{
salaryValue = DBNull.Value; // Store as a null
}
row["Hour_Salary"] = salaryValue;
В этом примере мы делаем тот же TryParse, но если он не удается, мы сохраняем DBNull.Value вместо значения по умолчанию 0.