|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
Annett : 18 Новичок Откуда: Donetsk,Ukraine
|
Дек 18, 2011 14:55 |
|
|
Доброе время суток! Помогите пожалуйста со срочным заданием.
У меня есть маленькая база PostgreSQL с двумя связанными таблицами и есть java приложение с 1 формой, содержащее поле для ввода строки поиска, таблица для вывода результата поиска и кнопки для добавления, редактирования и удаления записей из бд. Никакой обработки кнопок пока нет. Подключение к базе пока тоже не делала. Мне нужно реализовать поиск, вывод, удаление, редактирование и добавление записей из базы данных. Реализовать это нужно c помощью хранимых процедур и xml. Я вообще не представляю как это сделать. Дайте пожалуйста четкий алгоритм работы, что где вызывать и как передавать данные. Или напишите хотя бы ссылки на такую информацию. Это очень важно. Заранее огромное спасибо!
Последний раз редактировалось: Annett (Дек 18, 2011 15:25), всего редактировалось 1 раз |
|
|
|
 |
abihle : 320 Бывалый Откуда: Одесса
|
Дек 18, 2011 15:23 |
|
|
может
1) c помощью хранимых процедур и ; SQL |
|
|
|
 |
Annett : 18 Новичок Откуда: Donetsk,Ukraine
|
Дек 18, 2011 15:28 |
|
|
| Нет, именно xml. Т.е. связка должна быть java -> xml-документ -> хранимая процедура и обратно. |
|
|
|
 |
abihle : 320 Бывалый Откуда: Одесса
|
Дек 18, 2011 15:57 |
|
|
Так в чем проблема..
В PostrgeSql есть функции для импорта экспорта xml документов, для java также полно библиотек для работы с xml. |
|
|
|
 |
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:9
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) |
|
|
|
 |
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 |
|
|
|
 |
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, и выйти из нее не получится. |
|
|
|
|
 |
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 файлом? |
|
|
|
 |
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'; |
ошибка та же. |
|
|
|
 |
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', то работает.
Подскажите, как сделать? |
|
|
|
 |
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 След. |
Список форумов
-> Работа с базами данных |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|