Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/88: Рейтинг темы: голосов - 88, средняя оценка - 4.69
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278
MS SQL

Импорт данных из Excel в MS SQL

18.05.2017, 13:47. Показов 17599. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Знаю что много таких вопросов и большую часть из них я просмотрел не найдя ответа.

Задача такая:
Запускается программа, выбираем файл exel (много данных >2000) и данные из него записываем в таблицу БД
как это сделать ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.05.2017, 13:47
Ответы с готовыми решениями:

Импорт данных из Excel в БД SQL
Доброе время суток! Помогите народ, диплом горит :help::help::help: Как реализовать перенос данных из Excel в базу данных SQL. Перерыл кучу...

Импорт данных из Excel в MS SQL через приложение WinForms
Всем привет. В приложение С# WinForms нужно добавить возможность импорта данных из Excel в MS SQL. Пользователь просто выбирает нужный...

Импорт from EXCEL to SQL
Добрый день уважаемые форумчане) Столкнулся с проблемой импорта в sql serve 2012. Суть ее такова что имеются поля с датами но даты...

24
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
18.05.2017, 15:33
ну начнем с того, что 2000 - это очень мало данных, я бы понял о размерах в миллион строк - тогда можно играть еще.
Нужно подготовить все - чем хотите загружать (oledb, openxml ....) - и куда, в какую таблицу загружать. Потом каким образом будете работать с БД - старый добрый Ado.Net или новый EF - реализация этого в значительной мере отличается друг от дружки.
Лучше, наверное, начинать с простого - Ado.Net, потому что все остальное строится уже на этой технологии, и лучше понимать ее основы.
0
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
19.05.2017, 04:29
Здесь писал
В случае сохранения больших объемов в mssql, можно воспользоавться sqlbulkcopy
0
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278
23.05.2017, 15:49  [ТС]
Смотрел sqlbulkcopy, и другие варианты везде обрывочная информация ни одного живого примера.
Решил изобрести велосипед:

1) считываю все их EXEL
2) данные запихиваю в dataset
3) bp dataset пытаюсь инсертить в БД но тут вопрос
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
OleDbConnection connection = new OleDbConnection("Provider=System.Data.SqlClient;Data Source=MSSERV;Initial Catalog=JoinExel;Integrated Security=True");// ConfigurationManager.ConnectionStrings["AccessMTSP"].ConnectionString;
            OleDbDataAdapter adapter = new OleDbDataAdapter();
 
            try{
                    adapter.InsertCommand = new OleDbCommand("insert into test (q,w,e) values (q=?,w=?,e=?) ");
                    adapter.InsertCommand.Parameters.Add("q", OleDbType.VarChar, 50, "Q1");
                    adapter.InsertCommand.Parameters.Add("w", OleDbType.VarChar,50, "W1");
                    adapter.InsertCommand.Parameters.Add("e", OleDbType.VarChar, 50, "E1");
            
                    adapter.InsertCommand.Connection = connection;
 
                    adapter.Update(data.Tables[0]);
            }
            catch (Exception ex)
            {
            MessageBox.Show(ex.Message.ToString());
            }
MessageBox.Show("ok");
//q,w,e столбцы в бд nvarchar(50) null
Q1,W1,E1 - столбцы в datagrid от куда беру значения

ошибок не показывает, в базу не инсертит в чем может быть проблемма ??

Добавлено через 1 минуту
на всякий случай как считываю из EXEL


C#
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
       private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ope = new OpenFileDialog();
            ope.Filter = "Exel Files|*.xls;*.xlsx;*.xlsm";
            if (ope.ShowDialog() == DialogResult.Cancel)
                return;
            string filename = ope.FileName;
            Parse(filename);
            
            dataGridView1.DataMember = "dataTable";
            dataGridView1.DataSource = data.Tables[0]; //набор данных.
            MessageBox.Show(dataGridView1.RowCount.ToString());
           // OleDbDataAdapter adapter = new OleDbDataAdapter(command);
 
        }
        #region read from exel to dataset
        static DataSet Parse(string fileName)
        {
            string connectionString = string.Format("provider=Microsoft.ACE.OLEDB.12.0; data source={0};Extended Properties=Excel 8.0;", fileName);
            
            foreach (var sheetName in GetExcelSheetNames(connectionString))
            {
                using (OleDbConnection con = new OleDbConnection(connectionString))
                {
                    var dataTable = new DataTable();
                    string query = string.Format("SELECT * FROM [{0}]", sheetName);
                    con.Open();
                    OleDbDataAdapter adapter = new OleDbDataAdapter(query, con);
                    adapter.Fill(dataTable);//скопировли в данные через адаптер в таблицу dataTable
                    data.Tables.Add(dataTable);//таблицу добавили в DataSet "data"
                }
                
                
            }
 
            return data;
        }
        static string[] GetExcelSheetNames(string connectionString)
        {
            OleDbConnection con = null;
            DataTable dt = null;
            con = new OleDbConnection(connectionString);
            con.Open();
            dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
 
            if (dt == null)
            {
                return null;
            }
 
            String[] excelSheetNames = new String[dt.Rows.Count];
            int i = 0;
 
            foreach (DataRow row in dt.Rows)
            {
                excelSheetNames[i] = row["TABLE_NAME"].ToString();
                i++;
            }
 
            return excelSheetNames;
        }
        #endregion
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
23.05.2017, 16:58
kyvaldenius, метод adapter.Update будет вставлять только те записи, у которых состояние RowState.Added. Подозреваю, что записи, которые в вашей DataTable, такого состояния не имеют.
Цитата Сообщение от kyvaldenius Посмотреть сообщение
Смотрел sqlbulkcopy, и другие варианты везде обрывочная информация ни одного живого примера.
Там всё просто
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void BulcCopy(DataTable dt, string TableName,string connectionString)
        {
            using (SqlConnection mySqlConnection = new SqlConnection(connectionString))
            {
                mySqlConnection.Open();
                using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString))
                {
                    sbc.DestinationTableName = TableName;
                    //sbc.BulkCopyTimeout = 300;//если реально много записей, то можно установить Timeout.
                    sbc.WriteToServer(dt);
                }
            }
        }
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
23.05.2017, 21:59
Igr_ok, Вы так уверены? А у меня адаптер работает и с теми, которые modified ))
Bulccopy использовать на 2 тыс - как ракетой по воробью, можно, но необязательно. Я бы xml-ну загонял.
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
23.05.2017, 22:27
Цитата Сообщение от hoolygan Посмотреть сообщение
Igr_ok, Вы так уверены? А у меня адаптер работает и с теми, которые modified ))
Вы молодец) А ТС только InsertCommand создал.
0
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
24.05.2017, 03:18
Цитата Сообщение от hoolygan Посмотреть сообщение
Bulccopy использовать на 2 тыс - как ракетой по воробью, можно, но необязательно.
Один раз сделать чтобы потом не париться и по отработанной схеме хоть 2 тыс, хоть 100 тыс загонять.
Цитата Сообщение от hoolygan Посмотреть сообщение
Я бы xml-ну загонял.
Да как угодно никто же не говорит что это единственный верный способ.
З. Ы. У меня одна форма на все проекты только датасеты/пространства имен меняю.
0
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278
24.05.2017, 08:31  [ТС]
Случайно формой этой не делитесь ? хотелось бы глянуть как импорт должен работать по нормальному

Добавлено через 6 минут
добавил для каждой строки SetAdded
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  adapter.InsertCommand = new OleDbCommand("insert into test (q,w,e) values (q=?,w=?,e=?) ");
                    adapter.InsertCommand.Parameters.Add("q", OleDbType.VarChar, 50, "Q1");
                    adapter.InsertCommand.Parameters.Add("w", OleDbType.VarChar,50, "W1");
                    adapter.InsertCommand.Parameters.Add("e", OleDbType.VarChar, 50, "E1");
            
                    adapter.InsertCommand.Connection = connection;
 
                        foreach (DataRow row in data.Tables[0].Rows)
                        {
                             row.SetAdded();
                        }
 
 
                    adapter.Update(data.Tables[0]);

теперь хоть какойто результат есть, а именно :
1) Provider=SQLOLEDB
"Сообщение об ошибке не предусмотренно, код результата DB_E_ERRORSOCCURRED(0*80040e21)"
2)Provider=Microsoft.Jet.OLEDB.4.0
Произошли ошибки во время выполнения многошаговой операции OLE db ....Работа не выполнена
3)Provider=Microsoft.ACE.OLEDB.12.0
Произошли ошибки во время выполнения многошаговой операции OLE db ....Работа не выполнена
4) Provider=SqlClient
Поставщик .SqlClient не зарегистрирован на данном компьютере ( хотя другое приложение на этом компьютере только его и использует все работает)

с таким кто нибудь сталкивался ?
0
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
25.05.2017, 03:08
Исходник не ахти какой, но с моими задачами справляется.
Вложения
Тип файла: rar Old.rar (19.3 Кб, 102 просмотров)
0
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
25.05.2017, 03:38
З. Ы. там некоторые моменты запилены по определенную структуру базы.
0
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278
25.05.2017, 08:12  [ТС]
чето туплю, как увидеть саму визуальную форму ?
код вижу, события на кнопках вижу а вот визуальная часть формы как сделать?
0
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
25.05.2017, 08:49
а ты как добавлял?
на проекте -> добавить существующий элемент ->и все три файла выбрал?
0
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278
25.05.2017, 13:53  [ТС]
все три файла

Добавлено через 2 минуты
так и не разобрался с ошибками которые писал раньше.
По советам решил использовать sqlbulkcopy
(нашел хороший пример по которому делал https://code.msdn.microsoft.co... t-2b7ca7cf)
вот мой код:
C#
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
33
34
35
36
37
38
39
40
41
    OpenFileDialog ope = new OpenFileDialog();
            ope.Filter = "Exel Files|*.xls;*.xlsx;*.xlsm";
            if (ope.ShowDialog() == DialogResult.Cancel)
                return;
            string excelFilePath = ope.FileName;
 
            string ssqltable = "test";
            string myexceldataquery = "select q,w,e from [Лист1$]"; 
 
             try
             { //string sexcelconnectionstring = @"provider=microsoft.jet.oledb.4.0;data source=" + excelFilePath + 
                // ";extended properties=" + ""excel 9.0;hdr=yes;""; 
                //create our connection strings 
                 string sexcelconnectionstring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFilePath +
                ";Extended Properties=" + ""excel 8.0;hdr=YES;""; 
                string ssqlconnectionstring = "Data Source=KIYANKOBG;Initial Catalog=JoinExel;Integrated Security=True";
               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);
                }
                dr.Close();
                oledbconn.Close();
                MessageBox.Show("File imported into sql server.");
            }
             catch (Exception ex)
             {
                 MessageBox.Show(ex.Message.ToString());
             }
только есть некоторые моменты которые не понимаю
1) в exel файле 1 стока это заголовки которые он не должен читать , должен читать сразу со 2 строки но на деле 2 строку пропускает и читает 3 строку
2) Бывает выскакивает ошибка "неожиданный формат файла"/"не верный формат " в чем может быть проблема?
(бывает скопирую файл ничего в нем не меняя и начинается подобные проблемы приходиться открывать менять формат ячеек или строки удалять добавлять )

Добавлено через 16 минут
"на проекте -> добавить существующий элемент ->и все три файла выбрал?"
сделал так добавились три файла,
стою на файле SetServer.cs нажимаю SHIFT+F7 чтоб открылась визуальная часть , а она пустая просто голая форма

Добавлено через 2 часа 43 минуты
"внешняя таблица не имеет предполагаемый формат " - вот точное название ошибки
1
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
26.05.2017, 02:28
Есть другой способ: создаешь новую форму с таким же названием и заменяешь там основной код и код дизайнера из файлов.
0
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278
26.05.2017, 11:38  [ТС]
либо пишет ошибки в дизайнере либо пустая форма
0
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278
30.05.2017, 14:58  [ТС]
выбивает вот такую ошибку как можно исправить ??

Данное значение типа String из источника данных не может быть преобразовано в тип decimal указанного столбца назначения.

в базе тип numeric(16,2)

Добавлено через 18 минут
выбивает вот такую ошибку как можно исправить ??

Данное значение типа String из источника данных не может быть преобразовано в тип decimal указанного столбца назначения.
0
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
31.05.2017, 02:27
Возможно в источнике заменить . на ,
0
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278
31.05.2017, 08:23  [ТС]
Цитата Сообщение от Aferuga Посмотреть сообщение
Возможно в источнике заменить . на ,
Да абсолютно точно все заработало спасибо !
0
0 / 0 / 0
Регистрация: 03.12.2015
Сообщений: 24
13.01.2018, 14:08
kyvaldenius, привет! В итоге получилось загрузить данные из Exel в базу?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.01.2018, 14:08
Помогаю со студенческими работами здесь

Импорт из Excel в MS SQL
мой вопрос уже отображается в теме, но сформулирую его еще раз: у меня есть файл ехеля и мне нужно данные записать в таблицу бд. подскажите...

Импорт из Excel в DVG и сохранение в SQL
Импортирую из Excel в DVG следующим образом: private void button2_Click(object sender, EventArgs e) { if...

Импорт в SQL Excel файла (определение страниц и размеров)
Добрый день! Мне нужно реализовать импорт excel файла в SQL БД. Основную часть уже удалось реализовать, но осталась пара...

Чтение excel файла в Datagridview и импорт в sql сервер
Добрый день. Может есть у кого нибудь готовое решение ? Если нет, я столкнулся с такой проблемой. Прочитать и видеть в...

Импорт данных из excel в DataGridView
Здравствуйте, нужна Ваша помощь. Необходимо организовать импорт данных их Excel в datagridview c#. Возможно что-то не так с первой строкой,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru