SqlDataAdapter.Update未插入记录

时间:2015-08-28 10:26:32

标签: c# asp.net-mvc

我正在使用datatable进行批量插入,但无法在数据库中插入记录 和DataAdapter.Update返回0值。

这是我的数据表

enter image description here

以下是保存数据表记录的功能:

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(
			@P_PRODUCT,
			@P_PRESENTATION,
			@P_COUNTRY,
			@P_PRICE_TYPE,
			@P_PRICE_CHANGE_DATE,
			@P_PRICE,
			@P_USER_UUID,
			GETDATE()
		  )

END




有谁能告诉我我做错了什么?

3 个答案:

答案 0 :(得分:0)

我不知道SqlDataAdapter,但是如果你尝试使用SQlBulkCopy,它将会快速而简单地工作。试一试。

这是文档,你在那里得到了例子

https://msdn.microsoft.com/en-us/library/ex21zs8x(v=vs.110).aspx

答案 1 :(得分:0)

请打开探查器并检查您的SP是否被调用。可能不是,因为你的importdatatable没有添加新行,你只参数化了insert命令调用,但没有指示数据表来调用它。所以从代码中向数据表中添加一个新行,之后可能会调用sp。

答案 2 :(得分:0)

去解决方案: 问题是由于Datatable行状态,而从excel RowState读取数据表设置为Unchanged,因为DataAdapter在行状态下工作,它没有将dataTable行视为已添加

importDataTable.Rows[0].RowState; 

Unchanged

通过标记数据表行添加它起作用:

 foreach(DataRow row in importDataTable.Rows)
 {
            row.SetAdded();
 }