System.InvalidOperationException с SQlBulkCopy - PullRequest
       24

System.InvalidOperationException с SQlBulkCopy

2 голосов
/ 08 января 2010

Я получил следующую ошибку при выполнении массового копирования.

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) 

Я не знаю, что я делаю неправильно.

1 Ответ

0 голосов
/ 08 января 2010

Ваша переменная hourSalary - это строка, которую вы позже пытаетесь преобразовать в десятичное число, и это не удается.

Скорее всего, у вас либо пустое строковое значение, либо неверное значение.

В зависимости от ваших требований вы должны решить, что делать с недопустимым значением. В основном у вас есть две опции, кроме неудачи: Сохранить как значение по умолчанию (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.

...