2016-12-07 3 views
0

У меня есть один файл Excel, содержащий несколько листов. Каждое имя листа совпадает с именем таблицы в SQL Server. Мне нужно вставить данные этих листов Excel в соответствующие таблицы в базе данных.У меня есть один лист Excel с несколькими вкладками, вам нужно вставить эти данные в SQL Server с помощью C#

В SQL Server DB имеется 13 вкладок и 13 таблиц.

Я могу вставить данные одного листа в одну таблицу с помощью кода ниже.

String strConnection = "Data Source=.;Initial Catalog=<>;Integrated Security=True"; 

String excelConnString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0\"", filePath); 

// Create Connection to Excel work book 
OleDbConnection conn = new OleDbConnection(excelConnString); 

OleDbCommand cmd = new OleDbCommand(); 
cmd.Connection = conn; 

OleDbDataAdapter da = new OleDbDataAdapter(cmd); 
DataTable dt = new DataTable(); 

conn.Open(); 
DataTable dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
string sheetName = dtSheet.Rows[0]["table_name"].ToString(); 
cmd.CommandText = "select * from [" + sheetName + "]"; 
da.SelectCommand = cmd; 
da.Fill(dt); 

using (OleDbDataReader dReader = cmd.ExecuteReader()) 
{ 
    using(SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection)) 
    { 
     //Give your Destination table name 
     sqlBulk.DestinationTableName = "TABLE NAME IN SQL"; 
     sqlBulk.WriteToServer(dReader); 

     conn.Close(); 
    } 
} 

Как можно вставить данные со всех листов?

+0

, где вы на самом деле возникли проблемы? – Dispersia

+0

Спасибо Dispersia, на самом деле у меня есть одно преимущество с несколькими листами в вкладках, поэтому вам нужно вставлять данные в sql-сервер в несколько таблиц, одна вкладка - одна таблица – King

ответ

1

Следующие должно это сделать - вам просто нужно перебирать каждую строку в таблице таблицы:

... 
    DataTable dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

    // iterate each sheet 
    foreach (System.Data.DataRow sheet in dtSheet.Rows) 
    { 
     string sheetName = sheet["table_name"].ToString(); 
     cmd.CommandText = "select * from [" + sheetName + "]"; 
     da.SelectCommand = cmd; 
     da.Fill(dt); 

     using (OleDbDataReader dReader = cmd.ExecuteReader()) 
     { 
      using (SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection)) 
      { 
       // Give your Destination table name. Table name is sheet name minus any $ 
       sqlBulk.DestinationTableName = sheetName.Replace("$", ""); 
       sqlBulk.WriteToServer(dReader); 

       conn.Close(); 
      } 
     } 
    } 
} 
+0

Это действительно помогло, но цикл выбирает только один рабочий лист (вкладку) из доступа и не переходите к следующей вкладке, чтобы выполнить тот же процесс., Пожалуйста, помогите мне – King

+0

Пожалуйста, прочитайте как «Excel» не получите – King

+0

Попробуйте удалить conn, Close() из внутреннего оператора using - этого не должно быть. –

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