[英]System.InvalidOperationException with 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)
我不知道我在做什么錯。
您的hourSalary變量是一個字符串,稍后您嘗試將其轉換為Decimal,這將失敗。
您很可能具有空字符串值或無效值。
根據您的要求,您必須決定如何處理無效值。 除了失敗,您基本上有兩個選擇:存儲為默認值(也許為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值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.