2010-10-27 2 views
3

Я импортирую файл Excel (всего около 1000 записей) в выделенную базу данных SQL Server. Поскольку мне нужно работать с входящими данными из Excel (добавьте GUID для каждой строки, некоторые преобразования данных), я хочу делать это по строкам и не хочу для массового импорта (я ничего не имею против транзакций).Импорт файла Excel в SQL Server по строкам

Я смущен тем, как это сделать правильно. Я могу либо использовать SQLCommand с параметрами следующим образом:

SqlCommand sqlCommand = new SqlCommand("insert into TestTable(GUID,Name,Pricing) values(@GUID,@Name,@Pricing)", sqlConn); 
foreach (DataRow dr in ds.Tables[0].Rows) //<-- this is my Excel file to iterate through 
{ 
sqlCommander.Parameters.Clear(); 
String refGUID = Guid.NewGuid().ToString(); 
sqlCommander.Parameters.AddWithValue("GUID", refGUID); 
sqlCommander.Parameters.AddWithValue("Name", dr.ItemArray[0]); 
sqlCommander.Parameters.AddWithValue("Pricing", dr.ItemArray[1]); 
sqlCommander.ExecuteNonQuery(); 
} 

Или я могу использовать "Connected" режим, как так:

SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT GUID, Name, Pricing FROM TestTable", sqlConn); 
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter); 

DataSet myDataSet = new DataSet(); 
dataAdapter.Fill(myDataSet, "TestTable"); 
foreach (DataRow dr in ds.Tables[0].Rows) //<-- this is my Excel file to iterate through 
{ 
DataRow row = myDataSet.Tables[0].NewRow(); 
row["GUID"] = refGUID; 
row["Name"] = dr.ItemArray[0]; 
row["Pricing"] = dr.ItemArray[1]; 
myDataSet.Tables[0].Rows.Add(row); 
dataAdapter.Update(myDataSet); 
} 

Теперь мои вопросы следующие:

  1. Лучше ли отправлять команду INSERT для каждой строки (это будет метод SqlCommand) или лучше заполнить специальный DataSet (2-й метод)? Я полагаю, что «глупо» имеет 1000 вложений в SQL-сервер?
  2. dataAdapter.Update(myDataSet) < - Должен ли я сделать это ПОСЛЕ повторения всех строк Excel или для каждой строки (как показано в приведенном выше примере), это волшебным образом создаст транзакцию?
  3. Какой метод использовать? Существует также LINQ to SQL - почему бы не использовать это (возможно, из-за другого уровня производительности)?
  4. Что происходит с DataSet, когда возникает некоторая ошибка при чтении файла Excel - обновление все еще помещено на сервер SQL или все потеряно?


Короче: Я хочу чтобы импортировать Excel файл на сервер SQL строку за строкой в ​​то время внесения изменений на данных, которые должны быть импортированы (и я не хочу использовать пакеты SSIS [ потому что помимо преобразования данных я делаю намного больше с файлом Excel, например, импортируя его в Sharepoint и стреляя из Workflows] или BizTalk)
» » Как это сделать красиво?
В итоге я пошел и купил Aspose Cells. В распоряжении Aspose имеется очень хороший набор инструментов.

+5

Почему вы не хотите использовать SSIS? если инструмент подходит ... –

+0

Поскольку я одновременно импортирую файл Excel в Sharepoint и создаю Infopath Forms and Tasks и снимая Workflows, это не просто импорт. Я также гораздо более счастлив иметь свои руки «на коде», чем использовать какой-то пакет SSIS (которого я еще не создал, кроме базовых примеров). –

+0

Ваш вопрос пренебрегает упоминанием этой новой информации .... Но это почти наверняка возможно в SSIS ... –

ответ

4

Вы упоминаете, не желая использовать SSIS - но вы считали SqlBulkCopy? Тогда нет необходимости ничего, кроме .NET, но вы все равно можете использовать быстрый или самый прямой импорт.

Это будет принимать DataTable, поэтому вы можете подготовить свои данные в DataTable, а затем нажать на курок. Транзакции, возможно, поддерживаются IIRC. Для больших данных вы также можете реализовать IDataReader для обеспечения полной потоковой загрузки (при обработке каждой строки в пути).

+0

'SqlBulkCopy' звучит интересно, я посмотрю на него –

1

С учетом вашего описания проблемы: «Я хочу импортировать файл Excel в SQL Server по очереди, внося изменения в импортируемые данные» - SSIS - идеальный инструмент для работы.

Importing Excel data with SQL Server Integration Services SSIS with unicode and non-unicode data issues

+0

Я отредактировал сообщение и прокомментировал ваш предыдущий комментарий, чтобы уточнить. Это не так просто, как импорт некоторых файлов Excel в SQL Server, так как во время импорта запускаются другие процессы. Мой вопрос больше о понимании различий между различными методами. –

+0

SSIS - не надежный способ обмена данными между SQL и Excel. Слишком много ошибок. –

1

DataSet, вероятно, завершит отправку инструкций INSERT на сервер, поэтому, на мой взгляд, лучше просто отправить инструкции INSERT без DataSet.Вы также можете иметь больший контроль над процессом, например, проверку отдельных строк на наличие ошибок, ведение журнала и т. Д.

0

Вы можете преобразовать обработанную таблицу данных в XML и передать ее хранимой процедуре на сервере Sql (в одном запросе) и ваша хранимая процедура проанализирует XML для создания записей.

+0

Да, я мог бы это сделать. Но почему я? Почему бы не использовать DataSets? –

-1
INSERT INTO [dbo].[TableName] 
      ([ColumnName1] 
      ,[ColumnName2]) 
) 
SELECT [ColumnName1] 
      ,[ColumnName2] 

FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0','Data Source= PathToFile.xls;Extended Properties=Excel 8.0')...[Sheet1$] 
+1

Если вы отправляете код или XML, ** пожалуйста ** выделите эти строки в текстовом редакторе и нажмите кнопку «код» (101 010) на панели инструментов редактора, чтобы красиво отформатировать и выделить синтаксис! –

+0

мое плохое спасибо за ввод – Grant

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