2010-01-08 15 views
2

J'ai l'erreur suivante lors de l'exécution de bulkcopy.System.InvalidOperationException avec SQlBulkCopy

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

J'utilise le code suivant.

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

Mes types de données SQL pour les champs ci-dessus sont:

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) 

Je ne sais pas ce que je fais mal.

+0

Veuillez inclure la valeur de retour de Exception.ToString() (y compris la pile) L'idée est de savoir si vous obtenez l'exception lors du remplissage du DataTable ou lors du transfert du contenu DataTables dans la table de base de données. –

Répondre

0

Votre variable hourSalary est une chaîne que vous tentez plus tard de convertir en décimal et échoue.

Vous avez probablement une valeur de chaîne vide ou une valeur non valide. En fonction de vos besoins, vous devez décider quoi faire avec la valeur invalide. Vous avez essentiellement deux options sauf l'échec: Stocker en tant que valeur par défaut (0 peut-être?) Ou stocker en tant que valeur nulle.

Si vous souhaitez stocker une valeur par défaut, vous pouvez essayer ce qui suit lors de la conversion du salaire:

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; 

Cela garantira que vous obtenez une valeur décimale valide stockée dans votre colonne Hour_Salary.

Si vous souhaitez stocker une valeur nulle, alors vous devez modifier le code un peu:

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; 

Dans cet exemple, nous faisons la même chose TryParse, mais si elle ne nous stocker DBNull.Value au lieu de la valeur par défaut 0 valeur.