2010-02-26 6 views
4

J'ai créé un datatable et essayer d'insérer ce datatable par SqlBulkCopy mais en quelque sorte, il ne semble pas fonctionner pour moi ....SqlBulkCopy ne semble pas fonctionner pour moi

Je suis l'erreur,

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

mon DataSource est,

DataTable dt = new DataTable(); 
    dt.Columns.Add(new DataColumn("EmpId", typeof(Int64))); 
    dt.Columns.Add(new DataColumn("FromDate", typeof(DateTime))); 
    dt.Columns.Add(new DataColumn("ToDate", typeof(DateTime))); 
    dt.Columns.Add(new DataColumn("DaysPresent", typeof(decimal))); 
    dt.Columns.Add(new DataColumn("OpeningAdvance", typeof(double))); 
    dt.Columns.Add(new DataColumn("AdvanceDeducted", typeof(double))); 
    dt.Columns.Add(new DataColumn("RemainingAdvance", typeof(double))); 
    dt.Columns.Add(new DataColumn("SalaryGiven", typeof(double))); 
    dt.Columns.Add(new DataColumn("CreatedDate", typeof(DateTime))); 

    foreach (GridViewRow row in gridEmployee.Rows) 
    { 
     if (row.RowType == DataControlRowType.DataRow) 
     { 
      DataRow dr = dt.NewRow(); 
      dr["EmpId"] = Convert.ToInt64(((HiddenField)row.Cells[0].FindControl("HiddenId")).Value); 
      dr["FromDate"] = Convert.ToDateTime(GetMonthNumberFromAbbreviation(fromdate[1].ToString()) + '/' + fromdate[0].ToString() + '/' + fromdate[2].ToString()); 
      dr["ToDate"] = Convert.ToDateTime(GetMonthNumberFromAbbreviation(todate[1].ToString()) + '/' + todate[0].ToString() + '/' + todate[2].ToString()); 
      dr["DaysPresent"] = Convert.ToDecimal(((TextBox)row.Cells[3].FindControl("TxtDaysPresent")).Text); 
      dr["OpeningAdvance"] = Convert.ToDouble(((TextBox)row.Cells[4].FindControl("txtOpeningAdv")).Text); 
      dr["AdvanceDeducted"] = Convert.ToDouble(((TextBox)row.Cells[5].FindControl("TxtAdvanceDeducted")).Text); 
      dr["RemainingAdvance"] = Convert.ToDouble(((TextBox)row.Cells[6].FindControl("TxtClosingAdvance")).Text); 
      dr["SalaryGiven"] = Convert.ToDouble(((TextBox)row.Cells[7].FindControl("TxtSalary")).Text); 
      dr["CreatedDate"] = Convert.ToDateTime(System.DateTime.Now.ToString()); 
      dt.Rows.Add(dr); 
     } 
    } 
    SqlBulkCopy sbc = new SqlBulkCopy(connectionString); 
    sbc.DestinationTableName = "SalaryDetails"; 
    sbc.WriteToServer(dt); 
    sbc.Close(); 

Et ma table de destination ressemble à ceci,

alt text http://img231.imageshack.us/img231/5448/mytable.jpg

+0

image a expiré compagnon –

Répondre

6

Vous devez spécifier un mappage de colonne, car vous n'avez pas le même nombre de colonnes dans le DataTable et la table de destination.

Vous pouvez le faire comme ceci:

sbc.ColumnMappings.Add("EmpId", "EmpId"); 
sbc.ColumnMappings.Add("FromDate", "FromDate"); 
// and so on, with the rest of the columns; and after that comes 
sbc.WriteToServer(dt); 
sbc.Close(); 
+0

@treaschf comment ajouter mappage de colonnes? –

+0

@treaschf 'sbc.ColumnMappings.Add (" EmpId "," EmpId ");' est-ce que je veux faire .. –

Questions connexes