Member 13076604 Ответов: 1

Как обновить данные в SQL server, импортируя их из листа excel, и избежать дублирования данных и строк в базе данных?


Я загрузил лист excel и вставил данные в базу данных. Я внес некоторые изменения в этот лист . Я хочу загрузить это снова с этими новыми данными. Я хочу обновить эту таблицу в базе данных. Теперь новые значения вставляются путем добавления новых строк под существующими строками.


using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;


    public partial class LBMIS1New : System.Web.UI.Page
    {
    protected void Upload(object sender, EventArgs e)
    {
        //Upload and save the file
        string excelPath = Server.MapPath("~/Doc/") + Path.GetFileName(FileUpload1.PostedFile.FileName);
        FileUpload1.SaveAs(excelPath);

        string conString = string.Empty;
        string extension = Path.GetExtension(FileUpload1.PostedFile.FileName);
        switch (extension)
        {
            case ".xls": //Excel 97-03
                conString = ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString;
                break;
            case ".xlsx": //Excel 07 or higher
                conString = ConfigurationManager.ConnectionStrings["Excel07+ConString"].ConnectionString;
                break;

        }
        conString = string.Format(conString, excelPath);
        using (OleDbConnection excel_con = new OleDbConnection(conString))
        {
            excel_con.Open();
            string sheet1 = excel_con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0]["TABLE_NAME"].ToString();
            DataTable dtExcelData = new DataTable();

            //[OPTIONAL]: It is recommended as otherwise the data will be considered as String by default.
            dtExcelData.Columns.AddRange(new DataColumn[7] { new DataColumn("Id", typeof(int)),
                  new DataColumn("Banks", typeof(string)),
                   new DataColumn("Crop Loan", typeof(int)),
                    new DataColumn("Water Resources", typeof(decimal)),
                     new DataColumn("Farm Mechanisation", typeof(int)),
                      new DataColumn("Plantation & Horticulture", typeof(decimal)),
                new DataColumn("Forestry & Wasteland Dev.", typeof(int))
                 });

            using (OleDbDataAdapter oda = new OleDbDataAdapter("SELECT * FROM [" + sheet1 + "A2:F]", excel_con))
            {
                oda.Fill(dtExcelData);
            }
            excel_con.Close();

            string consString = ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
            using (SqlConnection con = new SqlConnection(consString))
            {
                using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
                {
                    //Set the database table name
                    sqlBulkCopy.DestinationTableName = "dbo.TestLDM";

                    //[OPTIONAL]: Map the Excel columns with that of the database table
                    sqlBulkCopy.ColumnMappings.Add("Id", "LDM_LBSMI1ID");
                    sqlBulkCopy.ColumnMappings.Add("Banks", "BankName");
                    sqlBulkCopy.ColumnMappings.Add("Crop Loan", "PCropLoanNo");
                    sqlBulkCopy.ColumnMappings.Add("Water Resources", "PCropLoanAmt");
                    sqlBulkCopy.ColumnMappings.Add("Farm Mechanisation", "PTermLoanWaterRNo");
                    sqlBulkCopy.ColumnMappings.Add("Plantation & Horticulture", "PTermLoanWaterRAmt");
                    sqlBulkCopy.ColumnMappings.Add("Forestry & Wasteland Dev.", "PTermLoanFarmMechanisationNo");
                    con.Open();
                    sqlBulkCopy.WriteToServer(dtExcelData);
                    con.Close();
                }
            }

        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindGridview();
        }
    }
    protected void BindGridview()
    {
        string conString = ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
        DataSet ds = new DataSet();
        using (SqlConnection con = new SqlConnection(conString))
        {
            con.Open();
            SqlCommand cmd = new SqlCommand("select * from dbo.TestLDM", con);
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(ds);
            con.Close();
            gvDetails.DataSource = ds;
            gvDetails.DataBind();
        }
    }
    protected void gvDetails_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gvDetails.PageIndex = e.NewPageIndex;
        BindGridview();
    }
}


Что я уже пробовал:

Должен ли я использовать для этого процедуру хранения? или там есть какой-то другой процесс обновления данных.

CHill60

Попробуйте усечь таблицу перед ее перезагрузкой

Member 13076604

ты можешь это объяснить? как это сделать?

CHill60

Я опубликовал решение-Обратите внимание, что я переместился туда, где открыто соединение

Member 13076604

это сработало. Спасибо. Но когда я попытался изменить данные типа string, он выдал мне ошибку "заданное значение типа String из источника данных не может быть преобразовано в тип nchar указанного целевого столбца".

CHill60

Это звучит так, как если бы данные, которые вы загружаете, были больше по длине, чем размер файла. nchar столбец-помните, что nchar-это фиксированная длина.

Member 13076604

ладно. спасибо. можете ли вы сказать мне, как я могу вставить Ключевые значения из файла web.config? < appsettings>
& lt;add key=" keyFinancialYr "value=" 2018-01-01 " />

< add key= "keyFinancialQtr" value= "1" />
.. У меня есть два столбца в моей таблице, названные как финансовый год и финансовый квартал. Я хочу, чтобы эти значения были вставлены из веб-конфигурации. вместе со значениями листа excel. Я пробовал вот так sqlBulkCopy.Колумнаппинг.Добавить (WebConfigurationManager.AppSettings["keyFinancialYr"], "Financial_yr");. Пожалуйста, помогите мне решить эту проблему.

CHill60

В чем проблема с тем, что вы пробовали?

Member 13076604

< appsettings>
& lt;add key=" keyFinancialYr "value=" 2018-01-01 " />

< add key= "keyFinancialQtr" value= "1" />

это находится в моем файле веб-конфигурации.
В моем коде позади я пробовал вот так.
DateTime x = преобразовать.ToDateTime(WebConfigurationManager.Параметр appsettings["keyFinancialYr"]);
int y = преобразовать.ToInt32(WebConfigurationManager.Параметр appsettings["keyFinancialQtr"]);
using (OleDbConnection excel_con = new OleDbConnection(conString))
{
excel_con.Открыть();
строка sheet1 = excel_con.GetOleDbSchemaTable (OleDbSchemaGuid.Таблицы, null).Строки[0] ["TABLE_NAME"].Метод toString();
DataTable dtExcelData = новый DataTable();

//[Необязательно]: рекомендуется, так как в противном случае данные по умолчанию будут рассматриваться как строка.
dtExcelData.Столбцы.AddRange(new DataColumn[9] { new DataColumn("Id", typeof(int)),
новый столбец данных ("Банки", typeof (string)),
new DataColumn ("Crop Loan", typeof(int)),
новый столбец данных ("водные ресурсы", typeof (десятичный)),
новая колонка данных ("Механизация фермы", typeof(int)),
новый столбец данных ("Plantation & Horticulture", typeof (decimal)),
новая колонка данных ("Forestry &Wasteland Dev.", typeof(int)),
новый столбец данных ("Financial_Quarter", typeof(int), y. ToString()),
новый столбец данных ("Financial_yr", typeof (DateTime), x. ToShortDateString())
});

Я могу хранить Financial_Quarter в своей базе данных. Но финансовый год дает ошибку. Я не могу преобразовать дату и время в строку . Пожалуйста помочь

CHill60

Является ли столбец sql для Financial_yr столбцом DateTime? Я бы финансовая__квартале и Financial_yr должны быть целые числа

Member 13076604

Я нашел решение. новый столбец данных ("Financial_yr", typeof(DateTime)) { DefaultValue = x }
Теперь это работает.

CHill60

:большой палец вверх:

1 Ответов

Рейтинг:
6

CHill60

Лично я всегда использую временную "промежуточную" таблицу при загрузке таких данных. Это означает, что я могу легко вставить некоторый код проверки, очистки или анализа перед обновлением основной таблицы. Это особенно полезно, если одна таблица обновляется несколькими источниками.

Однако вы спросили, как можно усечь таблицу ...

string consString = ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
using (SqlConnection con = new SqlConnection(consString))
{
    con.Open();

    using (SqlCommand trunc = new SqlCommand("Truncate table dbo.TestLDM", con);
    {
        trunc.ExecuteNonQuery();
    }

    using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
    {
        //Set the database table name
        sqlBulkCopy.DestinationTableName = "dbo.TestLDM";
 
        //[OPTIONAL]: Map the Excel columns with that of the database table
        sqlBulkCopy.ColumnMappings.Add("Id", "LDM_LBSMI1ID");
        sqlBulkCopy.ColumnMappings.Add("Banks", "BankName");
        sqlBulkCopy.ColumnMappings.Add("Crop Loan", "PCropLoanNo");
        sqlBulkCopy.ColumnMappings.Add("Water Resources", "PCropLoanAmt");
        sqlBulkCopy.ColumnMappings.Add("Farm Mechanisation", "PTermLoanWaterRNo");
        sqlBulkCopy.ColumnMappings.Add("Plantation & Horticulture", "PTermLoanWaterRAmt");
        sqlBulkCopy.ColumnMappings.Add("Forestry & Wasteland Dev.", "PTermLoanFarmMechanisationNo");
        //con.Open();
        sqlBulkCopy.WriteToServer(dtExcelData);
        //con.Close();
    }
    con.Close();
}