Gruja82 Ответов: 2

Как использовать sqlbulkcopy?


Всем привет. Я создал vb.net приложение Windows, которое находится в базе данных SQL Server для парфюмерного магазина. Мне нужно импортировать существующие данные из хранилища, которое хранится в файле Excel 97. Мой вопрос заключается в том, какой способ быстрее: использование хранимой процедуры с параметрами со значениями из ячеек рабочего листа, которая вставляет строки в таблицу базы данных, или использование SQLBulkCopy.
Рабочий лист содержит около 2000 записей.
Я уже пробовал первое решение и его работу, но для второго Я не использовал SQLBulkCopy.
Данные выглядят примерно так:
LONDA COLOR BOJA ZA KOSU 11 395,00 Ђ
ЦВЕТ КРАСКА РАЗНО 12 530,00 €

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

Dim xlapp As Excel.Application
Dim xlworkbook As Excel.Workbook
Dim xlworksheet As Excel.Worksheet
Dim newCulture As System.Globalization.CultureInfo
Dim OldCulture As System.Globalization.CultureInfo


xlapp = New Excel.Application

OldCulture = System.Threading.Thread.CurrentThread.CurrentCulture
newCulture = New System.Globalization.CultureInfo(xlapp.LanguageSettings.LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI))
System.Threading.Thread.CurrentThread.CurrentCulture = newCulture

xlworkbook = xlapp.Workbooks.Open(fileNamepetrovac)
xlworksheet = xlworkbook.Worksheets(1)

For i = 2 To xlworksheet.UsedRange.Rows.Count
    Me.cmduvozartikalapetrovac.Parameters("@naziv").Value = xlworksheet.Cells(i, 2).value.ToString
    Me.cmduvozartikalapetrovac.Parameters("@sifra").Value = xlworksheet.Cells(i, 4).value.ToString
    Me.cmduvozartikalapetrovac.Parameters("@cena").Value = Microsoft.VisualBasic.Left(xlworksheet.Cells(i, 5).value.ToString, Len(xlworksheet.Cells(i, 5).value.ToString) - 3)
    Me.cmduvozartikalapetrovac.Parameters("@plu").Value = xlworksheet.Cells(i, 4).value.ToString

    Me.cmduvozkasapetrovac.Parameters("@naziv").Value = xlworksheet.Cells(i, 2).value.ToString
    Me.cmduvozkasapetrovac.Parameters("@sifra").Value = xlworksheet.Cells(i, 4).value.ToString
    Me.cmduvozkasapetrovac.Parameters("@cena").Value = Microsoft.VisualBasic.Left(xlworksheet.Cells(i, 5).value.ToString, Len(xlworksheet.Cells(i, 5).value.ToString) - 3)
    Me.cmduvozkasapetrovac.Parameters("@ps").Value = "Ђ"

    Me.cmduvozkasapetrovac.ExecuteNonQuery()
    Me.cmduvozartikalapetrovac.ExecuteNonQuery()
Next
xlworkbook.Close()
xlapp.Quit()
System.Threading.Thread.CurrentThread.CurrentCulture = OldCulture


If xlworkbook IsNot Nothing Then
    Runtime.InteropServices.Marshal.ReleaseComObject(xlworkbook)
End If
If xlworksheet IsNot Nothing Then
    Runtime.InteropServices.Marshal.ReleaseComObject(xlworksheet)
End If
If xlapp IsNot Nothing Then
    Runtime.InteropServices.Marshal.ReleaseComObject(xlapp)
End If

2 Ответов

Рейтинг:
16

RickZeeland

Вы можете использовать .NET SQLBulkCopy класс, см. статью: Передача Данных С Помощью SqlBulkCopy[^]


Gruja82

Вот что я попробовал сделать. Он работает быстрее, чем "мой путь", но у меня возникли проблемы с Dim data() как String = line.Расщеплять(","). Проблема в том, что это объединяет всю строку в одну запись и вставляет в первый столбец. Что я должен использовать?

'Дим ДТ в качестве нового объекта DataTable
'Тусклая линия как строка = ничего
'Dim i как целое число = 0

"Использование sr в качестве StreamReader = File.OpenText("G:\KREZA\petrovac.xls")
"линия = СР.С readline
"Делай, пока линия не пустая
"Dim data() As String = line.Расщеплять(",")
- Если данные.Длина > 0 затем
"Если i = 0, то
"Для каждого элемента данных
- ДТ.колонки.Добавить(Новый Столбец Данных())

"Следующий пункт
"i += 1
"Конец, Если
"Дим подряд в качестве объекта datarow = ДТ.Невров()
- греби.ItemArray = данные
"dt.Rows.Add(строка)

"Конец, Если
"линия = СР.С readline

"Петля

"С Помощью

'Использование sr в качестве StreamReader = File.OpenText("G:\KREZA\petrovac.xls")
'строка = СР.С readline
- Делай, пока линия не пустая
'Dim data() As String = line.Split(","c)
- Если данные.Длина > 0 затем
- Для каждого элемента данных
- ДТ.колонки.Добавить(Новый Столбец Данных())

- Следующий пункт
'Дим подряд в качестве объекта datarow = ДТ.Невров
- греби.ItemArray = данные
'dt.Rows.Add(строка)
- Конец, Если
'строка = СР.С readline

- Петля
'Конец Использования

-cnparfimerija.Открыть()
'Using copy As New SqlBulkCopy(cnparfimerija)
- принято.Колумнаппингс.Добавить(0, 0)
- принято.ColumnMappings.Add(1, 1)
- принято.ColumnMappings.Add(2, 2)
- принято.ColumnMappings.Add(3, 3)
- принято.ColumnMappings.Add(4, 4)
- принято.ColumnMappings.Add(5, 5)
- принято.Колумнаппингс.Добавить(6, 6)
- принято.Колумнаппингс.Добавить(7, 7)
- принято.Колумнаппингс.Добавить(8, 8)
- принято.Колумнаппингс.Добавить(9, 9)
- принято.DestinationTableName = "Праймер"
- принято.WriteToServer(dt)

'Конец Использования
-cnparfimerija.Закрывать()

Рейтинг:
10

Gruja82

Я ее разгадал:

Dim tabela As DataTable
tabela = New DataTable

For i As Integer = 0 To xlworksheet.UsedRange.Columns.Count
    tabela.Columns.Add(New DataColumn())
Next

For i As Integer = 1 To xlworksheet.UsedRange.Rows.Count
    tabela.Rows.Add(CInt(xlworksheet.Cells(i, 2).value.ToString), xlworksheet.Cells(i, 1).value.ToString, CInt(xlworksheet.Cells(i, 4).value.ToString), CDbl(Microsoft.VisualBasic.Left(xlworksheet.Cells(i, 3).value.ToString, Len(xlworksheet.Cells(i, 3).value.ToString) - 3)))

Next

xlworkbook.Close()
xlapp.Quit()

cnparfimerija.Open()
Using copy As New SqlBulkCopy(cnparfimerija)
    copy.ColumnMappings.Add(0, 1)
    copy.ColumnMappings.Add(1, 2)
    copy.ColumnMappings.Add(2, 3)
    copy.ColumnMappings.Add(3, 4)

    copy.DestinationTableName = "ArtikliPetrovac"
    copy.WriteToServer(tabela)
End Using


Спасибо за помощь