2010-01-08 66 views
2

執行批量複製時出現以下錯誤。System.InvalidOperationException和SQlBulkCopy

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) 

我不知道我做錯了。

+0

請包括Exception.ToString()的返回值(包括堆棧跟蹤)想法是知道在填充DataTable時還是在將DataTables內容傳輸到數據庫表時,是否收到異常。 –

回答

0

您的hourSalary變量是一個字符串,您稍後嘗試將其轉換爲Decimal並且失敗。

很可能你有一個空字符串值或無效值。

根據您的要求,您必須決定如何處理無效值。基本上有兩個選項,除了失敗:存儲爲默認值(0可能?)或存儲爲空值。

如果你想存儲的默認值,那麼你可以嘗試轉換的工資時,以下幾點:

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,但是如果失敗了我們存儲而不是默認的0 DBNull.Value值。