System.InvalidOperationException con SQlBulkCopy

c# invalidoperationexception sqlbulkcopy

Pregunta

Obtuve el siguiente error al ejecutar bulkcopy.

System.InvalidOperationException
The given value of type String from the data source cannot be converted to 
type decimal of the specified target column.

Yo uso el siguiente código.

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

Mis tipos de datos SQL para los campos anteriores son:

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) 

No sé lo que estoy haciendo mal.

Respuesta aceptada

Su variable hourSalary es una cadena que luego intenta convertir a un decimal y esto falla.

Lo más probable es que tenga un valor de cadena vacío o un valor no válido.

Dependiendo de sus requisitos, debe decidir qué hacer con el valor no válido. Básicamente, tiene dos opciones, excepto el fallo: Almacenar como un valor predeterminado (0 ¿quizás?) O almacenar como un valor Nulo.

Si desea almacenar un valor predeterminado, puede intentar lo siguiente al convertir el salario:

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;

Esto asegurará que obtenga un valor decimal válido almacenado en su columna Hour_Salary.

Si desea almacenar un valor nulo, debe cambiar un poco el código:

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;

En este ejemplo, hacemos el mismo TryParse, pero si falla, almacenamos DBNull.Value en lugar del valor predeterminado de 0.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué