簡體   English   中英

SqlDataAdapter.Update不插入記錄

[英]SqlDataAdapter.Update not inserting the record

我正在使用數據表進行批量插入,但無法在數據庫中插入記錄,並且DataAdapter.Update返回0值。

這是我的數據表

在此處輸入圖片說明

這是用於保存數據表記錄的功能:

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 

誰能告訴我我做錯了嗎?

我不知道SqlDataAdapter,但是如果嘗試使用SQlBulkCopy,它將可以快速簡便地工作。 試試看。

這是文檔,您在那里有示例/

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

請打開分析器並檢查是否調用了您的SP。 可能不是,因為importdatatable沒有添加新行,所以您僅參數化了insert命令調用,但是沒有指示該數據表可以調用它的指示符。 因此,從代碼向數據表添加新行,然后可能會調用您的sp。

轉到解決方案:問題是由於Datatable行狀態,而從excel RowState讀取數據表設置為Unchanged時,由於DataAdapter處理行狀態,因此未將dataTable行視為已添加

importDataTable.Rows[0].RowState; 

Unchanged

通過將數據表行標記為已添加,它可以起作用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM