Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 07.03.2018
Сообщений: 10

Загрузить shapefile в базу Postgresql по кнопке в форме через код cmd

07.03.2018, 18:37. Показов 2469. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый!
Задача такая: загрузить shapefile в базу Postgresql по кнопке в форме через код cmd.
пример кода:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
string path = "D:\\test\\roads.shp";
using (NpgsqlConnection connSegm = new NpgsqlConnection(pathtodb))
            {
                connSegm.Open();
                var transaction = connSegm.BeginTransaction();
               
                using (transaction)
                {
                    try
                    {                    
                        System.Diagnostics.Process process = new System.Diagnostics.Process();
                        System.Diagnostics.ProcessStartInfo startInfo = new ProcessStartInfo();
                        startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
                        startInfo.FileName = "cmd.exe";
                        startInfo.Arguments = "/C && cd C:\\Program Files\\PostgreSQL\\9.4\\bin\\shp2pgsql.exe && shp2pgsql -s 4326 -W \u0022LATIN1\u0022 '" + path + "' roads | psql -U postgres -h localhost -p 5432 -d postgres";
                        process.StartInfo = startInfo;
                        process.Start();
                        process.WaitForExit();
 transaction.Commit();
                        connSegm.Close();
                       }
Программа проходит все слишком быстро и ничего не добавляется в схему public.
Когда просто выполняю команду в cmd слой добавляется.
Какие пути решения? Спасибо!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.03.2018, 18:37
Ответы с готовыми решениями:

Загрузить картинку через форму в базу данных
Ребят, возникла проблема. В теме на форуме увидела код для загрузки фотографии в БД. Решила сделать так же. И ничего, выдает ошибку. А...

Как поменять изображение на кнопке через код?
Здравия всем! Дело такое, создаётся кнопка так: <Button x:Name="button_window_state" HorizontalAlignment="Right"...

Как узнать html код сайта через CMD?
Как узнать html код сайта через CMD?

16
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,902
Записей в блоге: 1
07.03.2018, 21:06
igor sokolov, попробуй такую командную строку - без начального && и shp2pgsql.exe в команде cd
C#
15
startInfo.Arguments = "/C cd C:\\Program Files\\PostgreSQL\\9.4\\bin && shp2pgsql -s 4326 -W \u0022LATIN1\u0022 '" + path + "' roads | psql -U postgres -h localhost -p 5432 -d postgres";
P.S. Создание транзакции можно убрать. Она действует только в рамках указанной команды и, следовательно, только текущего приложения.
1
0 / 0 / 0
Регистрация: 07.03.2018
Сообщений: 10
08.03.2018, 00:45  [ТС]
OwenGlendower, попробовал ваш совет, но не помогло..
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,902
Записей в блоге: 1
08.03.2018, 00:59
igor sokolov, попробуй указать ключ /K вместо /C чтобы увидеть результаты выполнения команд. Это должно помочь в диагностике.
1
0 / 0 / 0
Регистрация: 07.03.2018
Сообщений: 10
12.03.2018, 14:25  [ТС]
OwenGlendower, спасибо за совет,пишет, что не удается открыть .dbf file. Пока ищу решения, но вдруг кто в курсе..
0
0 / 0 / 0
Регистрация: 07.03.2018
Сообщений: 10
26.03.2018, 18:48  [ТС]
Добрый вечер!
Вопрос такой: при запуске cmd по кнопке из формы для загрузки .shp файла в базу Postgesql пишет ошибку:
"Unable to open 'D:\test\roads.shp or 'D:\test\roads.SHP.
'D:\test\roads.shp': dbf file (.dbf) can not be opened."

Код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
string path = "D:\\test\\roads.shp";
using (NpgsqlConnection connSegm = new NpgsqlConnection(pathtodb))
{
System.Diagnostics.Process process = new System.Diagnostics.Process();
                        System.Diagnostics.ProcessStartInfo startInfo = new ProcessStartInfo();
                        startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
                        startInfo.FileName = "cmd.exe";                        
                        startInfo.Arguments = "/K cd C:\\Program Files\\PostgreSQL\\9.4\\bin && shp2pgsql -G -i -s 4326 -W \u0022LATIN1\u0022 '" + path + "' public.Roads_work_latlon1 | psql -U postgres -h localhost -p 5432 -d postgres";
                        process.StartInfo = startInfo;
                        process.Start();
                        process.WaitForExit();
}
Как это можно исправить?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,902
Записей в блоге: 1
26.03.2018, 20:23
igor sokolov, файл существует? Права на чтение/запись есть? Файл не занят другим процессом в это время?
0
0 / 0 / 0
Регистрация: 07.03.2018
Сообщений: 10
26.03.2018, 20:33  [ТС]
OwenGlendower, файл существует,лежит в отдельной папке,ни чем не занят.права есть.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,902
Записей в блоге: 1
26.03.2018, 20:36
igor sokolov, выполнить эту же команду из командной строки пробовал?
0
0 / 0 / 0
Регистрация: 07.03.2018
Сообщений: 10
26.03.2018, 20:49  [ТС]
да из командной строки все работает,задача просто по кнопке сделать это. почему тт он не может вероятно открыть the?сам shape file состоит из нескольких подслоев. но в командной строке все это цепляется и загружается.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,902
Записей в блоге: 1
26.03.2018, 21:03
igor sokolov, попробуй указать WorkingDirectory для ProcessStartInfo такой же который был в командной строке
0
0 / 0 / 0
Регистрация: 07.03.2018
Сообщений: 10
27.03.2018, 14:02  [ТС]
OwenGlendower, попробую,завтра отпишу!

Добавлено через 16 часов 56 минут
OwenGlendower, указал
C#
1
 startInfo.WorkingDirectory = Path.GetDirectoryName(startInfo.FileName);
верно? ошибка такая же остается.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,902
Записей в блоге: 1
27.03.2018, 14:43
Цитата Сообщение от igor sokolov Посмотреть сообщение
C#
1
startInfo.WorkingDirectory = Path.GetDirectoryName(startInfo.FileName);
верно?
Если в FileName находится строка "cmd.exe", то нет т.к. это вернет пустую строку.
1
0 / 0 / 0
Регистрация: 07.03.2018
Сообщений: 10
28.03.2018, 19:19  [ТС]
OwenGlendower, попробую решить задачу через создание .bat файла, который буду запускать по кнопке в форме. Через командную строку все выполняется, проблема с написание этого же действия в bat файле. Проблема вероянтно с синтаксисом. Искал примеры,но не увидел решения.
В командной строке выполняю 2 действия: 1.cd C:\Program Files\PostgreSQL\9.4\bin 2.shp2pgsql -G -i -s 4326 -W "LATIN1" D:\shp2pgsql\borders.shp borders | psql -U postgres -h localhost -p 5432 -d postgres
Слой загружается в базу. В блокноте пробую написать аналогично, но выдает ошибку пути.

start "c:\Program Files\PostgreSQL\9.4\bin" "shp2pgsql -G -i -s 4326 -W \u0022LATIN1\u0022 D:\shp2pgsql\borders.shp public.borders | psql -U postgres -h localhost -p 5432 -d postgres"
exit

Как написать, чтобы параметр заработал?Спасибо!
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,902
Записей в блоге: 1
28.03.2018, 23:57
Лучший ответ Сообщение было отмечено igor sokolov как решение

Решение

igor sokolov, в bat файле можно сделать так
Windows Batch file
1
2
3
@echo off
cd /d C:\Program Files\PostgreSQL\9.4\bin
shp2pgsql -G -i -s 4326 -W "LATIN1" D:\shp2pgsql\borders.shp borders | psql -U postgres -h localhost -p 5432 -d postgres
И, кстати, раз каталог меняется на C:\Program Files\PostgreSQL\9.4\bin перед выполнен ием команды, то почему не попробовать то что я предлагал выше - указать WorkingDirectory?
C#
1
2
3
4
5
6
7
8
9
System.Diagnostics.ProcessStartInfo startInfo = new ProcessStartInfo()
{
    FileName = "cmd.exe",
    Arguments = "/K shp2pgsql -G -i -s 4326 -W \u0022LATIN1\u0022 '" + path + "' public.Roads_work_latlon1 | psql -U postgres -h localhost -p 5432 -d postgres",
    WorkingDirectory = @"C:\Program Files\PostgreSQL\9.4\bin",
    WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal
};
System.Diagnostics.Process process = process.Start(startInfo);
process.WaitForExit();
Добавлено через 1 минуту
Сейчас подумал что возможно код не работал из-за отсутствия параметра /d у команды cd. Он необходим если каталог находится на другом диске.
1
0 / 0 / 0
Регистрация: 07.03.2018
Сообщений: 10
29.03.2018, 13:01  [ТС]
OwenGlendower, да, спасибо большое, через bat файл получилось загрузить слой в базу. А вот с кодом в форме снова пишет:Unable to open 'C:\shp2pgsql\borders.shp or 'C:\shp2pgsql\borders.SHP. 'C:\shp2pgsql\borders.shp': dbf file (.dbf) can not be opened. D:\dev\PanoDataToRelease\PanoDataAppToRe lease\PanoDataAppToRelease\bin\Debug>.
Я даже перенес слой на диск С, чтобы был на одном с программой shp2pgsql, но нет. Может тут тоже надо указать параметр в команде для того чтобы открылся слой?
На строчку
C#
1
System.Diagnostics.Process process = process.Start(startInfo);
ругается, я написал так:
C#
1
2
3
4
System.Diagnostics.Process process = new System.Diagnostics.Process();
                        process.StartInfo = startInfo;
                        process.Start();
                        process.WaitForExit();
Пока сделаю запуск bat файла в форме, но может все же есть решение по первому пути?Спасибо!
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,902
Записей в блоге: 1
29.03.2018, 13:20
Цитата Сообщение от igor sokolov Посмотреть сообщение
На строчку
C#
1
System.Diagnostics.Process process = process.Start(startInfo);
ругается, я написал так:
Буква p должна быть заглавной
C#
1
System.Diagnostics.Process process = Process.Start(startInfo);
Цитата Сообщение от igor sokolov Посмотреть сообщение
но может все же есть решение по первому пути?
Должно быть, но я пас.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.03.2018, 13:20
Помогаю со студенческими работами здесь

Не могу загрузить код страницы через synapse
Помогите разобраться, synapse начал изучать недавно, поэтому и не могу понять что не так. Вот код: Source:= TStringList.Create; ...

Как загрузить картинку наImage через код
Пишу Image1.Picture := 'c:\main.bmp' но String с TPicture не дружит. Как можно другим способом загрузить картинку на Image, не...

Открытие присоединенной рамки объекта в форме с чертежом в форме по кнопке
Здравствуйте, в форме имеется поле ole выведенное через присоединенную рамку объекта. по щелчку на поле ole происходит открытие...

Мягко подключить базу данных в проекте через код
Мягко подключить базу данных в проекте через код

Запись картинок в базу postgresql
Пытаюсь из 1с записать картинки в постгре После гугления пришел к такому коду image = Новый COMОбъект("ADODB.Stream"); ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru