2015-08-28 2 views
0

Я делаю пакетную вставку с использованием datatable, но не могу вставить запись в базу данных и DataAdapter.Update возвращает 0 значение.SqlDataAdapter.Update не вставлять запись

Вот мой DataTable

enter image description here

Вот функция для сохранения записи в DataTable:

public long SaveImportData(DataTable importDataTable, int userUUid) 
    { 
     try 
     { 
      long result = 0; 
      using (var sqlConnection = new SqlConnection(DBManager.ConnectionString)) 
      { 
       using (var dataAdapter = new SqlDataAdapter()) 
       { 
        dataAdapter.InsertCommand = new SqlCommand(ReferencePricingQueryConstants.usp_RP_IMPORT_DATA, sqlConnection); 
        dataAdapter.InsertCommand.CommandType = CommandType.StoredProcedure; 
        dataAdapter.InsertCommand.Parameters.Add("@P_PRODUCT", SqlDbType.NVarChar, 100, "PRODUCT"); 
        dataAdapter.InsertCommand.Parameters.Add("@P_PRESENTATION", SqlDbType.NVarChar, 200, "PRESENTATION"); 
        dataAdapter.InsertCommand.Parameters.Add("@P_COUNTRY", SqlDbType.NVarChar, 30, "COUNTRY"); 
        dataAdapter.InsertCommand.Parameters.Add("@P_PRICE_TYPE", SqlDbType.NVarChar, 30, "PRICE_TYPE"); 
        dataAdapter.InsertCommand.Parameters.Add("@P_PRICE_CHANGE_DATE", SqlDbType.DateTime, 38, "PRICE_CHANGE_DATE"); 
        dataAdapter.InsertCommand.Parameters.Add("@P_PRICE", SqlDbType.Float, 38, "PRICE"); 
        dataAdapter.InsertCommand.Parameters.AddWithValue("@P_USER_UUID", userUUid); 
        dataAdapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None; 
        dataAdapter.UpdateBatchSize = 100; ; 
        result = dataAdapter.Update(importDataTable); 
        return result; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      _logger.Error(ex); 
      return 0; 
     } 

Вот хранимая процедура:

ALTER PROCEDURE [dbo].[usp_RP_IMPORT_DATA] 
 
(
 
@P_PRODUCT NVARCHAR(100), 
 
@P_PRESENTATION NVARCHAR(200), 
 
@P_COUNTRY NVARCHAR(30), 
 
@P_PRICE_TYPE NVARCHAR(30), 
 
@P_PRICE_CHANGE_DATE DATETIME, 
 
@P_PRICE FLOAT, 
 
@P_USER_UUID INT 
 
) 
 
AS 
 
BEGIN 
 

 
    
 
INSERT INTO [dbo].[IMPORTED_PRICES] 
 
      ([PRODUCT],[PRESENTATION],[COUNTRY],[PRICE_TYPE],[PRICE_CHANGE_DATE],[PRICE],[CREATED_BY],[CREATED_TS]) 
 
    VALUES(
 
\t \t \t @P_PRODUCT, 
 
\t \t \t @P_PRESENTATION, 
 
\t \t \t @P_COUNTRY, 
 
\t \t \t @P_PRICE_TYPE, 
 
\t \t \t @P_PRICE_CHANGE_DATE, 
 
\t \t \t @P_PRICE, 
 
\t \t \t @P_USER_UUID, 
 
\t \t \t GETDATE() 
 
\t \t ) 
 

 
END

Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно?

+0

что писать? Какая ошибка? – Artyom

+1

А где же процедура? – Artyom

+0

@Artyom: добавлен SP в сообщение и не дает никакой ошибки DataAdapter.Update возвращает значение 0. – Muntajib

ответ

0

Pls открытым профилировщика и проверить, является ли называется ваш SP или нет. Наверное, нет, так как ваш importdatatable не имеет новых добавленных строк, вы только параметризовали вызов команды insert, но нет указателя на его имя для вызова datatable. поэтому добавьте новую строку в datatable из кода, и после этого ваш sp, вероятно, будет вызван.

0

Перейти решение: Вопрос был обусловлен Datatable состояния строки, при чтении DataTable из первенствуйте RowState было установлено без изменений, поскольку DataAdapter работает на состоянии строки не было лечение Datatable строки как добавленный

importDataTable.Rows[0].RowState; 

Unchanged

Помечая DataTable строк, добавил он работал:

foreach(DataRow row in importDataTable.Rows) 
{ 
      row.SetAdded(); 
} 
Смежные вопросы