繁体   English   中英

带有SQlBulkCopy的System.InvalidOperationException

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM