2016-12-21 2 views
-3

Я хочу, чтобы пользователь передавал данные из файлов Excel в SQL, используя приложение C# WinForms по одному файлу за раз. Файлы Excel состоят из похожих столбцов, поэтому могут отсутствовать новые столбцы или столбцы. Данные строки будут отличаться.Перенос данных Excel в таблицу SQL с разными столбцами

Например:

Excel файл 1: Имя, Город Штат
Excel файл 2: имя, город, почтовый индекс
Excel файл 3: имя, город, графство

В моей существующей таблице SQL у меня есть столбцы: Имя, Город, Население, Школы

Как вставить новый Excel файлы с похожими именами столбцов в существующую базу данных SQL?

Моя мысль заключается в том, чтобы скопировать новые данные файла Excel во временные таблицы и затем вставить их в существующую таблицу SQL. Проблема в том, что я не знаю, как написать код C# (или SQL-запрос), который будет вставлять новые данные Excel с более или менее столбцами, чем существующая таблица SQL.

ответ

1

Для этой цели вам нужен No-SQL, если вам нужно ввести столбцы, которые еще не являются частью таблицы, тогда sql не является хорошим вариантом, если вы используете C# до alter table, тогда будьте осторожны с последствиями. Если вы уверены, что все возможные имена столбцов впереди, попробуйте изменить таблицу перед началом установки.

0

Это не должно быть слишком сложно. Экспортируйте данные из Excel в таблицу промежуточных таблиц в SQL Server. Код C# может выглядеть примерно так.

public void importdatafromexcel(string excelfilepath) 
{ 
    //declare variables - edit these based on your particular situation 
    string ssqltable = "tdatamigrationtable"; 
    // make sure your sheet name is correct, here sheet name is sheet1, so you can change your sheet name if have 
    different 
    string myexceldataquery = "select student,rollno,course from [sheet1$]"; 
    try 
    { 
     //create our connection strings 
     string sexcelconnectionstring = @"provider=microsoft.jet.oledb.4.0;data source=" + excelfilepath + 
     ";extended properties=" + "\"excel 8.0;hdr=yes;\""; 
     string ssqlconnectionstring = "server=mydatabaseservername;user 
     id=dbuserid;password=dbuserpassword;database=databasename;connection reset=false"; 
     //execute a query to erase any previous data from our destination table 
     string sclearsql = "delete from " + ssqltable; 
     sqlconnection sqlconn = new sqlconnection(ssqlconnectionstring); 
     sqlcommand sqlcmd = new sqlcommand(sclearsql, sqlconn); 
     sqlconn.open(); 
     sqlcmd.executenonquery(); 
     sqlconn.close(); 
     //series of commands to bulk copy data from the excel file into our sql table 
     oledbconnection oledbconn = new oledbconnection(sexcelconnectionstring); 
     oledbcommand oledbcmd = new oledbcommand(myexceldataquery, oledbconn); 
     oledbconn.open(); 
     oledbdatareader dr = oledbcmd.executereader(); 
     sqlbulkcopy bulkcopy = new sqlbulkcopy(ssqlconnectionstring); 
     bulkcopy.destinationtablename = ssqltable; 
     while (dr.read()) 
     { 
      bulkcopy.writetoserver(dr); 
     } 

     oledbconn.close(); 
    } 
    catch (exception ex) 
    { 
     //handle exception 
    } 
} 

Затем на SQL Server переместите данные из промежуточной таблицы в вашу конечную производственную таблицу. Ваш SQL может выглядеть примерно так.

insert into production 
select ... 
from staging 
where not exists 
(
    select 1 from staging 
    where staging.key = production.key 
) 

Это мой .02. Я думаю, что у вас будет намного больше контроля над всем процессом.

0

Если вы читаете этот вопрос, то мой ответ на этот другой вопрос может быть полезным для вас (просто создать класс для обработки каждого информационной строки, процесса первенствовать файл и выполнить объемную вставку, как объяснено здесь):

Bulk insert is not working properly in Azure SQL Server

Надеюсь, это поможет.

Смежные вопросы