Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Помогите!!!Срочно! Реализация java+xml+PostgreSQL
Список форумов
 ->  Работа с базами данных


На страницу 1, 2  След. 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
Annett : 18
Новичок
Откуда: Donetsk,Ukraine

СообщениеДек 18, 2011 14:55 
Ответить с цитатой
Доброе время суток! Помогите пожалуйста со срочным заданием.
У меня есть маленькая база PostgreSQL с двумя связанными таблицами и есть java приложение с 1 формой, содержащее поле для ввода строки поиска, таблица для вывода результата поиска и кнопки для добавления, редактирования и удаления записей из бд. Никакой обработки кнопок пока нет. Подключение к базе пока тоже не делала. Мне нужно реализовать поиск, вывод, удаление, редактирование и добавление записей из базы данных. Реализовать это нужно c помощью хранимых процедур и xml. Я вообще не представляю как это сделать. Дайте пожалуйста четкий алгоритм работы, что где вызывать и как передавать данные. Или напишите хотя бы ссылки на такую информацию. Это очень важно. Заранее огромное спасибо!


Последний раз редактировалось: Annett (Дек 18, 2011 15:25), всего редактировалось 1 раз
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
abihle : 320
Бывалый
Откуда: Одесса

СообщениеДек 18, 2011 15:23 
Ответить с цитатой
может
1) c помощью хранимых процедур и ; SQL
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Annett : 18
Новичок
Откуда: Donetsk,Ukraine

СообщениеДек 18, 2011 15:28 
Ответить с цитатой
Нет, именно xml. Т.е. связка должна быть java -> xml-документ -> хранимая процедура и обратно.
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
abihle : 320
Бывалый
Откуда: Одесса

СообщениеДек 18, 2011 15:57 
Ответить с цитатой
Так в чем проблема..
В PostrgeSql есть функции для импорта экспорта xml документов, для java также полно библиотек для работы с xml.
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Daigotsu : 170
Новичок

СообщениеДек 20, 2011 2:21 
Ответить с цитатой
Алгоритм такой:
через форму генерите xml документ (посмотрите в сторону JAXB), потом уже средствами postgre читаем xml и делаем действие, которое надо.
по поводу postgre - вот ссылка первая из google: samokhvalov.com/syrcodis2007.ps
а для java&xml - посмотрите генерацию xml на основе класса, это очень просто www.epam.by/doc/book_epam_by/Part_2_Chapter_16.pdf страница 336
К началу Посмотреть профиль Отправить личное сообщение
Annett : 18
Новичок
Откуда: Donetsk,Ukraine

СообщениеДек 20, 2011 3:24 
Ответить с цитатой
Спасибо большое, но до этого еще далеко.
Не получается создать соединение с БД, а именно подключить драйвер. Что я делаю не так? Подскажите пожалуйста.
В CLASSPATH драйвер прописан.
CLASSPATH = C:\Program Files\Java\jdk1.6.0_21\lib\postgresql.jar;D:\TestTask\PersonsForm\lib\postgresql.jar;C:\Program Files\NetBeans 6.5.1\ide10\modules\ext\postgresql-8.3-603.jdbc3.jar

Последний пусть добавила, т.к. NetBeans ссылается почему-то туда.

сам драйвер скопировала уже куда только можно:
C:\Program Files\Java\jdk1.6.0_21\lib
C:\Program Files\NetBeans 6.5.1\ide10\modules\ext
D:\TestTask\PersonsForm\lib
C:\Program Files\Java\jre6\lib\ext

Метод, где создаю подключение следующий:
Код:

 public static void ConnToDataBase()
   {
  Connection my_base=null;

  try {

   Thread.currentThread().getContextClassLoader().loadClass("org.postgresql.Driver");
Class.forName("org.postgresql.Driver");
 JOptionPane.showMessageDialog( null,"Драйвер подключен!",
             "Подключение к драйверу!",JOptionPane.WARNING_MESSAGE);
  }
  catch(java.lang.ClassNotFoundException e){
      JOptionPane.showMessageDialog( null,"Ошибка при подключени драйвера!",
             "Ошибка!",JOptionPane.WARNING_MESSAGE);
  }
  try{ //Пытаемся соединиться с БД
      my_base=DriverManager.getConnection("jdbc:postgesql://127.0.0.1/test_task", "postgres", "masterkey");

     if (my_base!=null){
         JOptionPane.showMessageDialog( null,"Вход выполнен!",
             "Подключение к БД!",JOptionPane.WARNING_MESSAGE);}

  }
  catch(SQLException ex){
      //обработка исключения
      System.out.println("SQLException:"  + ex.getMessage());
      JOptionPane.showMessageDialog( null,"Ошибка при подключени к базе данных!",
             "Ошибка!",JOptionPane.WARNING_MESSAGE);
  }
   }



Выпадает:
xception in thread "AWT-EventQueue-0" Local Exception Stack:
Exception [TOPLINK-4003] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DatabaseException
Exception Description: Configuration error. Class [org.postgresql.Driver] not found.
at oracle.toplink.essentials.exceptions.DatabaseException.configurationErrorClassNotFound(DatabaseException.java:101)
at oracle.toplink.essentials.sessions.DefaultConnector.loadDriver(DefaultConnector.java:183)
at oracle.toplink.essentials.sessions.DefaultConnector.connect(DefaultConnector.java:9Cool
at oracle.toplink.essentials.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:184)
at oracle.toplink.essentials.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:582)
at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:280)
at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:229)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:93)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:126)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:120)
at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:91)
at my.personform.PersonFormUI.initComponents(PersonFormUI.java:47)
at my.personform.PersonFormUI.<init>(PersonFormUI.java:34)
at my.personform.PersonFormUI$8.run(PersonFormUI.java:384)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
SQLException:No suitable driver found for jdbc:postgesql://127.0.0.1/test_task
BUILD SUCCESSFUL (total time: 5 seconds)
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Annett : 18
Новичок
Откуда: Donetsk,Ukraine

СообщениеДек 20, 2011 8:49 
Ответить с цитатой
Скопировала по перечисленным выше местам драйвер, кот. шел в комплекте с PostgreSQL и удалила все из CLASSPATH, поместила туда
C:\Program Files\Java\jre6\lib\ext\postgresql.jar
В результате к драйверу подключение все-таки произошло, но к базе так и не происходит. Ошибка:

SQLException:No suitable driver found for jdbc:postgesql://127.0.0.1/test_task
SQLState : 08001
ErrorCode : 0
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Daigotsu : 170
Новичок

СообщениеДек 20, 2011 12:31 
Ответить с цитатой
библиотеки лучше класть в папку lib в корне проекта.
насколько знаю, в NetBeans нужно использовать Class.forName(), хотя это делать вообще не нужно, на самом деле, ДрайверМэнеджер сам всё сделает. Ну это на будущее(в eclipse точно не нужно class.ForName)
Я с постгри не работал, но попробуйте jdbc:postgresql://сервер:порт/база_данных , т.е. указать порт.
Ошибка указывает на то, что ошибка именно в подключении.
К началу Посмотреть профиль Отправить личное сообщение
Skipy : 4801
Я тут живу!
Откуда: Москва, Россия

СообщениеДек 20, 2011 14:14 
Ответить с цитатой
Daigotsu писал(а):
насколько знаю, в NetBeans нужно использовать Class.forName(), хотя это делать вообще не нужно, на самом деле, ДрайверМэнеджер сам всё сделает.


Это неправда. При инициализации соединения вручную Class.forName с именем драйвера вызывать обязательно. Только в этом случае драйвер регистрируется в менеджере.
_________________
С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других!
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Daigotsu : 170
Новичок

СообщениеДек 20, 2011 18:50 
Ответить с цитатой
Skipy, тогда не понял, вот например, один метод:
Код:
public synchronized void initConnections() {
      if (!isDatabaseInit() && db_bundle != null) {
         this.configure(db_bundle);

         try {
            freeConnections = new ArrayBlockingQueue<Connection>(
                  connectionNumber, true);
            for (int i = 0; i < connectionNumber; i++) {
               Connection connection = DriverManager.getConnection(
                     database_url, username, password);
               freeConnections.offer(connection);
            }
            setDatabaseInit(true);
         } catch (SQLException e) {
            log.error(e.getMessage());
               // go to error page!
         } finally {
            log.info(connectionNumber + " : connections created");
         }

      }
   }


Class.forName - здесь, и где-то ещё нет и не было. но всё работает. Или я упускаю какой-то момент?
К началу Посмотреть профиль Отправить личное сообщение
Annett : 18
Новичок
Откуда: Donetsk,Ukraine

СообщениеДек 20, 2011 23:19 
Ответить с цитатой
>попробуйте jdbc:postgresql://сервер:порт/база_данных
не помогло
Благодаря танцам с бубном удалось подключиться к бд.
Заменила строчку
Код:
my_base=DriverManager.getConnection("jdbc:postgesql://127.0.0.1;databaseName=test_task", "postgres", "masterkey")

на
Код:
my_base=DriverManager.getConnection("jdbc:postgresql://localhost:5432/test_task?user=postgres&password=masterkey");

и заработало! Материал взяла отсюда http://darkraha.com/rus/dbapi/dbapi01.php В самом конце статьи там предлагается этот метод.
Теперь затык в следующем.
Нужно создать хранимую процедуру, принимающую и обрабатывающую xml параметр.
Как организовать извлечение строчки из xml файла?
Вообще такое есть в PostgreSQL?
Сначала я подумала, что нужно использовать функцию XMLSERIALIZE, но, как оказалось, она делает что-то другое.
При выполнении запроса:
Код:
SELECT XMLSERIALIZE (content 'use.xml' AS varchar(65));

в результате просто строчка use.xml.
Как мне организовать чтение из xml файла?
Нашла функцию pg_read_file, но при запросе:
Код:
SELECT us.code_user, us.first_name, us.name,us.last_name     
FROM users us
WHERE lower(trim(first_name)||' '||trim(name)||' '||trim(last_name)) like lower(TRIM(pg_read_file('полный путь к файлу\use.xml'))) ;

выпадает ошибка:
ERROR: absolute path not allowed
Нашла об этом следующее:
Цитата:
существуют стандартные функции администрирования сервера:

pg_read_file – Чтение файла
pg_ls_dir – Листинг директории

Однако реальной пользы от этих функций мало, так как они работают только в директории, указанной в $PGDATA, и выйти из нее не получится.
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Annett : 18
Новичок
Откуда: Donetsk,Ukraine

СообщениеДек 21, 2011 2:39 
Ответить с цитатой
В общем, ничего изящнее не придумала.
Создала таблицу:
Цитата:
CREATE TABLE A
(
A varchar(65)
);

Но тут снова непонятная проблема:
Хочу в прямо в хранимой функции заполнять эту таблицу:
Код:
CREATE FUNCTION search_fio() returns void as '
BEGIN
 copy A
from 'полный путь к файлу\use.xml'
END;
'LANGUAGE 'plpgsql';

Выпадает ошибка:
ERROR: syntax error at or near "use"
LINE 4: from 'use.xml'
При указании полного пути, тоже самое. Что ему не нравится?

Если копирование делать вне процедуры, все ок.

Подскажите еще, как более красиво работать с xml файлом?
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Annett : 18
Новичок
Откуда: Donetsk,Ukraine

СообщениеДек 22, 2011 13:11 
Ответить с цитатой
Неужели никто не знает, почему выпадает ошибка?
Пробовала
Код:
CREATE FUNCTION search_fio() returns void as '
BEGIN
 copy "A"
from E'use.xml'
Delimiter as ';';
END;
'LANGUAGE 'plpgsql';

ошибка та же.
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Annett : 18
Новичок
Откуда: Donetsk,Ukraine

СообщениеДек 22, 2011 16:21 
Ответить с цитатой
Получилось создать функцию, использую не ковычку, а "$$".
Не могу копировать в таблицу, указав не полный путь к файлу, а имя файла. В идеале мне нужно, чтоб было так:
/*Создание хранимой процедуры на просмотр*/
CREATE FUNCTION search_fio(xml) returns xml as $$
DECLARE
u text;
BEGIN
SET xmloption TO CONTENT;
u:=XMLSERIALIZE (content $1 as text);
IF ( xml_is_well_formed(u)=TRUE) THEN
copy "a"(name_for_print)
from 'u'
Delimiter as ';';
u:=xmlparse(content u);
return u;
END IF;
END
$$
LANGUAGE 'plpgsql';

А Вызов происходил из java программы так:
select search_fio('use.xml');

Функция компилируется успешно, но при вызове выдается ошибка:
select search_fio('use.xml')
ERROR: could not open file "u" for reading: No such file or directory
CONTEXT: SQL statement "copy "a"(name_for_print) from E'use.xml'
Delimiter as ';'"
PL/pgSQL function "search_fio" line 8 at SQL statement

Если написать from 'use.xml' ошибка таже.
Если написть from 'полный путь к файлу\use.xml', то работает.
Подскажите, как сделать?
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Daigotsu : 170
Новичок

СообщениеДек 22, 2011 16:46 
Ответить с цитатой
ну так передавайте полный путь к xml! вы же в java программе создавали(или брали откуда-то) файл. Значит у вам есть и путь у нему.

Про $$ тоже подумал(когда доки просматривал по функциям), но из-за незнания postgre - не советовал. Так что читайте внимательней доки.
UPD:
Заметил ваш вызов процедуры. Не стоит это делать через "select function(a,b)"
Есть интерфейс CallableStatement, он предназначен для вызова процедур хранимых в БД, вот пример использования:

Код:

CREATE PROCEDURE getempname
(emp_ssn IN INT, emp_name OUT VARCHAR) AS
BEGIN
SELECT name
INTO emp_name
FROM employee
WHERE SSN = EMP_SSN;
END

//Тогда для получения имени служащего employee через вызов данной //процедуры необходимо исполнить java-код вида:

String SQL = "{call getempname (?,?)}";
CallableStatement cs = conn.prepareCall(SQL);
cs.setInt(1,822301);
//регистрация выходящего параметра
cs.registerOutParameter(2,java.sql.Types.VARCHAR);
cs.execute();
String empName = cs.getString(2);

Doc - http://jdbc.postgresql.org/documentation/81/callproc.html
К началу Посмотреть профиль Отправить личное сообщение
 
Начать новую тему  Ответить на тему
Страница 1 из 2
На страницу 1, 2  След.
Список форумов
 -> Работа с базами данных


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru