帶有SQlBulkCopy的System.InvalidOperationException

c# 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) 

我不知道我做錯了什麼。

一般承認的答案

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



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因