Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
1723 / 1547 / 165
Регистрация: 25.07.2015
Сообщений: 2,650

ADO.NET + MSSQL

16.12.2019, 08:42. Показов 2923. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем ку !!
Коллеги , нужна помощь.
Стыдно говорить , но завис на ровном месте .
Как говорил наш незабвенный "Никогда такого не было и вот опять " (с)
Расклад следующий : надо состряпать строку запроса UPDATE ( для ADO.NET или MSSQL -не важно)
Везде ругается на последние символы. Второй день пошёл .
Видимо я зациклился , зашорился и не могу найти решение .
Выпил весь волокардин в доме , жена книжку читает - боится высунуться , собачки прячутся - я негодую ))))
VB.NET
1
2
Dim strUpdate As String =
              "UPDATE " & data.dbo.temp_csv_table & " SET " & strPole & " " = " " REPLACE(" " & strPole & ", ' " ' ,'' )""
Предыстория , предвкушая вопросы :а нахрена это надо.
Там , где я тружусь решили освоить программку 1С Альфа Автосалон+Автосервис+Автозапчасти.
Всем хороша , но прайсы от поставщиков цепляет или из внешних файлов или из внешней БД.
НО, эта гнида не умеет пропускать ошибочные записи и на пол пути может отвалиться при загрузке,
если что-то в ней не понравится.
Освоить 1С не предлагать - я старый консерватор и этот птичий язык не понимаю.
Вот и возникла потребность состряпать БД , куда будут заливаться прайсы , а 1С будет автоматом к ним цепляться.
Я -тварь ленивая и нетерпеливая ,и по сему мне в лом каждый день форматировать эту кучу файлов.
По сему придумалась загрузка через BULK INSERT в MSSQL.
Да, изначально мы не знаем структуры присылаемого нам прайса: ни кол-во столбцов , ни их названия ...ничего
По сему заливаем его во временную таблицу и там уже форматируем под свои нужды, а потом
запихиваем "чистые" данные уже в конечную таблицу , к которой и подцепиться 1С
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.12.2019, 08:42
Ответы с готовыми решениями:

ADO в VB.Net
Всем привет! Помогите, пожалуйста: перехожу с VB.6 в срочном порядке на VB.Net. В приложении используется ADO. Переписывать на ADO.Net нет...

Как старый ADO в VS.Net ?
что то интересное - подключаю компоненту ADO, ставлю HFlexGrid , в ADo инициализирую подключение к базе - все нормально, а вот в HFlexGrid...

Оновить таблицу через ADO.NET
Может поможете? Внизу код при помощи которого я хочу добавить в Access новую запись , но обновить в самой базе у меня ничего не...

29
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,293
16.12.2019, 09:06
Kulma, и что, каждый раз разная структура? И как вы из них данные потом берёте не зная структуры? Я к тому, что данные было бы не плохо приводить к нормальному виду перед выгрузкой в базу, а не после. Это и правильнее и производительнее.
0
1723 / 1547 / 165
Регистрация: 25.07.2015
Сообщений: 2,650
16.12.2019, 10:42  [ТС]
Usaga, так и знал , что возникнут подобного рода вопросы
Правильнее - возможно.
Производительнее - однозначно НЕТ.
Файл формата csv 870 тыс. строк с предварительной обработкой грузится в базу около 12 минут
Через BULK в temp таблицу и с последующей обработкой и заливкой в конечную таблицу
через INSERT ...SELECT на стороне сервера все эти процедуры занимают меньше минуты

Загрузка с разной структурой в temp

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  Friend Sub createTempTable()
        Try
            fileShortName = "temp_csv_table"
            Dim sqlCreateTmpTable As String = "IF OBJECT_ID('" & fileShortName & "','U') IS NOT NULL DROP Table " & fileShortName & " ;" _
                                                               & " Create Table " & fileShortName & " (id int) "
            ' Connect_DB()
            Dim cmmCreatetable As New SqlCommand(sqlCreateTmpTable, cnnSQL)
            cmmCreatetable.ExecuteNonQuery()
            cmmCreatetable.Dispose()
            For i As Integer = 1 To colMyReader
                Dim addcolumn As String = "ALTER TABLE " & fileShortName & " ADD [pole" & i & "] nvarchar(max) null"
                Dim cmmAddColumn As New SqlCommand(addcolumn, cnnSQL)
                cmmAddColumn.ExecuteNonQuery()
                cmmAddColumn.Dispose()
            Next
            Dim dropColumn As String = "ALTER TABLE " & fileShortName & " DROP column id"
            Dim cmmDropId As New SqlCommand(dropColumn, cnnSQL)
            cmmDropId.ExecuteNonQuery()
            cmmDropId.Dispose()
 
        Catch ex As Exception
            MsgBox(ex.Message)
 
        End Try
 
    End Sub
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 Friend Sub CsvLoadToBase()
        Connect_DB()
        Dim encode As System.Text.Encoding = Encoding.Default
        Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(EXstrFile, encode)
            MyReader.TextFieldType = FileIO.FieldType.Delimited
            MyReader.SetDelimiters(";") 'задаём разделитель полей в текстовом файле
            Dim currentRow As String()
            Try
                Dim a As String = MyReader.LineNumber.ToString
                currentRow = MyReader.ReadFields 'считываем первую строку в текстовом файле с названием полей
                colMyReader = MyReader.ReadFields.Length 'вычисляем кол-во полей 
                delimFields = ";"
                createTempTable()
 
                Dim bulkFile As String = "BULK INSERT " & fileShortName & " " _
                            & " " _
                            & "FROM  '" & EXstrFile & "' " _
                            & "WITH ( " _
                            & "FIELDTERMINATOR = '" & delimFields & "', " _
                            & "ROWTERMINATOR = '0x0a', " _
                            & "CODEPAGE = 'ACP' " _
                            & ")"
 
                Dim cmmBulk As New SqlCommand(bulkFile, cnnSQL)
                cmmBulk.ExecuteNonQuery()
                cmmBulk.Dispose()
            Catch ex As Exception
                MsgBox(ex.Message)
                Exit Sub
            End Try
        End Using
    End Sub
Первый блок читает структуру файла и создаёт на её основе таблицу в БД
Второй блок - это собственно заливка данных во временную таблицу.
Да, там переменная в первом блоке ....на самом деле можно статично прошить название
создаваемой таблицы. Это я эксперементировал с файлами разного формата )))

Добавлено через 6 минут
Да, забыл сказать : про BULK INSERT в ADO.NET знаю.
Возможностей изначально больше, но по факту в моём случае они ключевого значения не играют, т.к.
зачастую в присылаемых файлах полно мусора.
То на то и выходит в итоге.
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,293
16.12.2019, 10:47
Цитата Сообщение от Kulma Посмотреть сообщение
Файл формата csv 870 тыс. строк с предварительной обработкой грузится в базу около 12 минут
Через BULK в temp таблицу и с последующей обработкой и заливкой в конечную таблицу
Никто вам не помешает руками формировать запросы на вставку уже очищенных в коде данных. Если из всей CSV'шки используются не все поля, то это будет ещё быстрее.

И как вы потом данные нужные вытаскиваете из временной таблицы? Глазами на её содержимое смотрите? Так это можно сделать и перед выгрузкой в базу. Работать будет ещё быстрее.
0
1723 / 1547 / 165
Регистрация: 25.07.2015
Сообщений: 2,650
16.12.2019, 11:05  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Никто вам не помешает руками формировать запросы на вставку уже очищенных в коде данных.
Да пробовал - около 12 минут через DataReader, ч форматированием нужных строк
Цитата Сообщение от Usaga Посмотреть сообщение
И как вы потом данные нужные вытаскиваете из временной таблицы?
Никак
Заливаю в конечную таблицу как есть,предварительно отформатировав(в этом и загвоздка-строка UPDATE строится)
В итоге это выглядит так ....надо один раз привязать к 1С таблицу в базе
Миниатюры
ADO.NET + MSSQL  
0
1723 / 1547 / 165
Регистрация: 25.07.2015
Сообщений: 2,650
16.12.2019, 11:06  [ТС]
Если есть какие-то идеи в коде буду признателен
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,293
16.12.2019, 11:16
Лучший ответ Сообщение было отмечено Kulma как решение

Решение

Kulma, наверное так:

Visual Basic
1
"UPDATE " & data.dbo.temp_csv_table & " SET " & strPole & " = REPLACE("& strPole & ", ' "" ' ,'' )"
1
1723 / 1547 / 165
Регистрация: 25.07.2015
Сообщений: 2,650
16.12.2019, 11:33  [ТС]
Usaga, спасибо вам. Буду пробовать.
Реально вопрос стыдный , но что-то зациклился .
0
0 / 0 / 0
Регистрация: 14.02.2016
Сообщений: 9
27.12.2019, 12:17
Почитал правила форума.
Порядок создания тем.
...
2. Если собираетесь создать новую тему, определитесь с разделом или существующей темой, в которой ведется обсуждение этого вопроса.

Поэтому задаю вопрос здесь. Заголовок вроде бы подходит.
Я мучаюсь с VB.net два дня, раньше никогда им не занимался. Возможно делаю что то не верно, но повторяю по примерам отсюда:
http://samoychiteli.ru/document26007.html

http://www.realcoding.net/article/view/2129#1
и некоторым другим.

Мой VB.NET встроен в скаду Movicon.NEXT. Для отладки я скачал .NET среду разработки visual studio 2019. Сначала добьюсь работоспособности в ней, потом попробую перенести в скаду.

Мне нужно отправить запрос в mssql express 2014 или в mssql express 2012 и получить назад строку (наверное. я хз что мне должно вернуть, но хорошо бы строку). Сам запрос я отладил, он работает в скрипте на Python 3.

ВЕСЬ код, который я смог написать выглядит так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Imports System
Imports System.Data.SqlClient
 
Module Program
    Sub Main(args As String())
        Dim mySQLConnString As String
        Dim mySQLConn As SqlConnection 'тут ошибка BC30002 Тип "SqlConnection" не определён
 
        Console.WriteLine("Hello World!")
    End Sub
End Module
Я абсолютно не понимаю почему это происходит. Вот ни капельки. Если бы не было библиотеки
VB.NET
1
Imports System.Data.SqlClient
(это ведь библиотека? в литературе почему то называют модулем и при этом пишут System.Data.dll) то ругалось бы на первую строчку. У меня ругается на
VB.NET
1
Dim mySQLConn As SqlConnection
Видимо я не понимаю каких то базовых вещей. Пытался поискать как установить библиотеку System.Data в гугле и яндексе. Вываливается только куча подозрительных сайтов и ни одного от майкрософт. В примерах у других людей это работает и никакие установки не требовались... Не знаю даже в каком направлении думать.

Поиск по тексту ошибки в основном ведет на обсуждения С# или советы использовать полное имя System.Data.SqlClient.SqlConnection, что тоже приводит к ошибке. Правда другой:

Ошибка BC31424 Тип "System.Data.SqlClient.SqlConnection " в сборке "ConsoleApp1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" переадресован в сборку "System.Data.SqlClient, Version=4.6.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". Либо ссылка на "System.Data.SqlClient, Version=4.6.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" отсутствует в вашем проекте, либо тип "System.Data.SqlClient.SqlConnection " отсутствует в сборке "System.Data.SqlClient, Version=4.6.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". ConsoleApp1 C:\Users\User\source\repos\ConsoleApp1\C onsoleApp1\Program.vb
Подскажите, что не так??
0
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
27.12.2019, 20:40
Схематичный пример
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Imports System.Data.SqlClient
Module Module1
    Private tb As DataTable
    Sub Main()
        Dim dbPath As String = "..."
        Dim cnnString As String = "..."
        Dim cnn As New SqlConnection(cnnString)
        Dim query As String = "SELECT * FROM ..."
        cnn.Open()
        Dim da As SqlDataAdapter = New SqlDataAdapter(query, cnn)
        da.Fill(tb) 'данные выбранные по запросу из базы записаны в таблицу
        cnn.Close()
        Console.WriteLine(tb.Rows(0).Item(0).ToString) 'вывод значения из таблицы (первая строка первое поле)
    End Sub
End Module
0
0 / 0 / 0
Регистрация: 14.02.2016
Сообщений: 9
27.12.2019, 21:04
ovva, ну это же тот пример с которого я брал. ошибка в
VB.NET
1
Dim cnn As New SqlConnection(cnnString)
Пишет: BC30002 Тип "SqlConnection" не определён
0
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
27.12.2019, 21:29
vivaXAPOH, выложите ваш проект
0
0 / 0 / 0
Регистрация: 14.02.2016
Сообщений: 9
27.12.2019, 22:02
ovva, так я всё и выложил. в нём больше нет ни строчки, как я и написал. или мне сам файл .vb выложить?
Цитата Сообщение от vivaXAPOH Посмотреть сообщение
ВЕСЬ код, который я смог написать выглядит так:
Imports System
Imports System.Data.SqlClient
Module Program
    Sub Main(args As String())
        Dim mySQLConnString As String
        Dim mySQLConn As SqlConnection 'тут ошибка BC30002 Тип "SqlConnection" не определён
Console.WriteLine("Hello World!")
    End Sub
End Module
0
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
27.12.2019, 22:47
vivaXAPOH, я ведь не зря просил выложить проект. Там можно посмотреть не только файл vb, но и используемые настройки, подключенные библиотеки и т.д.
Но если это сложно, то не могли бы вы пояснить, как создавался проект, ибо если это делать "традиционным" способом, то базовые библиотеки должны присутствовать. Что я понимаю под "традиционным" способом: в VS в меню выбираем File/New Project и в открывшемся окне выбираем тип проекта (в данном случае Console Application), далее набираем код.
Проверить подключенные библиотеки можно, если в "Обозреватели решений" выбрать "Показать все файлы".
PS. В предложенном мной коде нужно в начало подставить
VB.NET
1
tb = New DataTable
и в конец
VB.NET
1
Console.ReadKey()
Чтобы успеть что-то увидеть.
0
0 / 0 / 0
Регистрация: 14.02.2016
Сообщений: 9
28.12.2019, 00:02
ovva, понял. я не знал что там такое хранится... да,я сделал просто консольное приложение "традиционным" способом. Открыл визио студио, там запустил среду разработки, мне предложило создать новое консольное приложение.

К сожалению проект сейчас на компе на работе, но я написал всего 3 строчки, никакие настройки тронуть не мог потому что не знаю где они. Я написал те 3 строчки, под номерами 2, 5 и 6, больше ничего не трогал:
VB.NET
1
2
3
4
5
6
7
8
9
Imports System
Imports System.Data.SqlClient
Module Program
    Sub Main(args As String())
        Dim mySQLConnString As String
        Dim mySQLConn As SqlConnection 'тут ошибка BC30002 Тип "SqlConnection" не определён
Console.WriteLine("Hello World!")
    End Sub
End Module
Добавлено через 1 минуту
остальное было сгенерировано автоматически
0
1723 / 1547 / 165
Регистрация: 25.07.2015
Сообщений: 2,650
28.12.2019, 07:56  [ТС]
vivaXAPOH, SqlConnection -это общий класс в составе библиотеки System.Data.SqlClient.
Чтобы с ним работать , здесь
Цитата Сообщение от vivaXAPOH Посмотреть сообщение
Dim mySQLConn As SqlConnection 'тут ошибка BC30002 Тип "SqlConnection" не определён
обязательно должно стоять ключевое слово New , объявляющее создание нового
экземпляра класса SqlConnection , т.е. строка должна выглядеть так
VB.NET
1
Dim mySQLConn As New SqlConnection
В коде , который вам предоставил ovva это есть.
Вариантов написания несколько , например ещё вариант
VB.NET
1
Dim mySQLConn As SqlConnection = New SqlConnection(cnnString)
но всегда через кл.слово New должен объявляться новый экземпляр .
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,732
Записей в блоге: 1
28.12.2019, 08:56
Цитата Сообщение от Kulma Посмотреть сообщение
но всегда через кл.слово New должен объявляться новый экземпляр
Это бесспорно, НО я без проблем объявил переменную для соединения:
VB.NET
1
2
Dim nConn As SQLConnection ' объявил переменную, ошибок нет
nConn = New SQLConnection() ' создал экземпляр, ошибок нет
проканало!!!
Для справки WinForms, FW 2.0, может в Version=4.6.1.0 что-то поменяли.
0
1723 / 1547 / 165
Регистрация: 25.07.2015
Сообщений: 2,650
28.12.2019, 09:14  [ТС]
Uswer,
Цитата Сообщение от Kulma Посмотреть сообщение
Вариантов написания несколько
Ваш - один из....
К слову , я так всегда пишу , объявляя переменную
Цитата Сообщение от Uswer Посмотреть сообщение
VB.NET
1
Dim nConn As SQLConnection
на уровне класса.И уже потом в коде процедур создаю её экземпляр
Цитата Сообщение от Uswer Посмотреть сообщение
VB.NET
1
nConn = New SQLConnection()
по мере надобности.
Кому как удобнее )))
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,732
Записей в блоге: 1
28.12.2019, 09:19
Так у vivaXAPOH, в строке 6 при объявлении переменной возникает ошибка, ПАЧЕМУ?
0
1723 / 1547 / 165
Регистрация: 25.07.2015
Сообщений: 2,650
28.12.2019, 09:37  [ТС]
Uswer, а как вы сами думаете ?
В каком месте его кода вы видите объявление экземпляра SQLConnection через New ?

Не по теме:

Такое ощущение , что всё , что написано мной ранее - это только для себя я писал ...



Добавлено через 4 минуты
Должно быть или так
VB.NET
1
2
3
4
5
6
7
8
9
10
Imports System
Imports System.Data.SqlClient
Module Program
    Dim mySQLConn As SqlConnection
    Sub Main(args As String())
        Dim mySQLConnString As String
        mySQLConn = New SqlConnection 
Console.WriteLine("Hello World!")
    End Sub
End Module
или так
VB.NET
1
2
3
4
5
6
7
8
9
Imports System
Imports System.Data.SqlClient
Module Program
        Sub Main(args As String())
        Dim mySQLConnString As String
        Dim mySQLConn As New SqlConnection 
Console.WriteLine("Hello World!")
    End Sub
End Module
или так
VB.NET
1
2
3
4
5
6
7
8
9
Imports System
Imports System.Data.SqlClient
Module Program
        Sub Main(args As String())
        Dim mySQLConnString As String
        Dim mySQLConn As SqlConnection = New SqlConnection(cnnString)
Console.WriteLine("Hello World!")
    End Sub
End Module
Но уж точно не так , как в его коде )))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.12.2019, 09:37
Помогаю со студенческими работами здесь

Как создать подключение посредством ADO.NET?
Здравствуйте! Пытаюсь создать подключение посредством ADO. Никак не подключается. Помогите пожалуйста. DataGridView мне не нужен. ...

ADO.NET и Access - проблема с автоинкрементными столбцами
Здесь такое дело: Я подцеплен к БД Access, где содержиться две таблицы, связанные по принципу один-ко-многим. У каждой таблицы есть...

Почему ADO .Net не коннектится с dbf базой, а с ADODB всё проходит?
Dim conStr As String = 'Provider=Microsoft OLE DB Provider for ODBC Drivers;Password='''';User ID=Admin;Data Source= Path...' Dim strSQL...

Инсталяция приложения VB.Net в системе без .NET Framework нужной версии
Работая под Win8.1 и Visual Studio 2010 Prof скомпилировал напсанный на VB.Net exe-файл прилолжения Windows Form. Хочу запустить это...

Работа с Excel средствами VB.net. Как перевести код из VBA в VB.net?
Коллеги, добрый день! Нужна помощь! В свое время был написан макрос для Excel, но прошло и потребности выросли. Было принято...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru