Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Java Базы данных (JDBC, JPA, Hibernate)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2011, 06:45   #1
Osanve
Пользователь
 
Аватар для Osanve
 
Регистрация: 11.12.2010
Сообщений: 50
По умолчанию Java + MySQL (Windows XP) не работает INSERT INTO

Здравствуйте.

При выполнении кода:
Код:
jButton1 = new JButton();
getContentPane().add(jButton1);
jButton1.setText("Сохранить");
jButton1.setBounds(12, 64, 118, 21);
jButton1.addActionListener(new java.awt.event.ActionListener()
{
	@Override
	public void actionPerformed(ActionEvent event)
	{
		baza.setNomen("INSER INTO floor (code, state) VALUES ('"+jTextField1.getText()+"', "+jCheckBox1.isSelected()+")");
	}
});
запись в таблицу не осуществляется, но при этом код:
Код:
model = new FloorModel();
model.setTableData(baza.getNomen("SELECT * FROM floor"));
table = new JTable(model);
выполняется нормально.

Переменная baza является объектом класса KFDB. В обоих случаях (это два разных класса) она передается в качестве параметра в конструктор следующим образом (привожу прототипы):
Код:
public Floor(final KFDB baza);
public AddFloor(final KFDB baza);
Код класса KFDB:
Код:
package ru.osanve.zerkala.server;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class KFDB
{
	private Connection con = null;
	private JFrame myFrame = null;
	
	// Конструктор
	// На входе: driver - драйвер доступа к БД, url - url БД, login - логин, pass - пароль
	public KFDB(String driver, String url, String login, String pass)
	{
		try
		{
			Class.forName(driver);
			con = DriverManager.getConnection(url, login, pass);
		}
		catch (ClassNotFoundException ex)
		{
			JOptionPane.showMessageDialog(myFrame, "Cannot find this db driver classes.", "Ошибка!", JOptionPane.ERROR_MESSAGE);
		}
		catch (SQLException e)
		{
			JOptionPane.showMessageDialog(myFrame, "Cannot connect to this db.", "Ошибка!", JOptionPane.ERROR_MESSAGE);
		}
	}
	
	// Функция SQL-запроса для получения выборочной таблицы
	// На входе: query - SQL-запрос
	// На выходе: Vector<Vector<Object>> - таблица с данными
	public Vector<Vector<Object>> getNomen(String query)
	{
		Vector<Vector<Object>> retVector = new Vector<Vector<Object>>();
		try
		{
			Statement st = con.createStatement();
			ResultSet rs = st.executeQuery(query);
			ResultSetMetaData rsmd = rs.getMetaData();
			int cols = rsmd.getColumnCount();
			while(rs.next())
			{
				Vector<Object> newRow = new Vector<Object>();
				for(int i = 1; i <= cols; i++)
				{
					newRow.add(rs.getObject(i));
				}
				retVector.add(newRow);
			}
			rs.close();
			st.close();
		}
		catch (SQLException e)
		{
			JOptionPane.showMessageDialog(myFrame, "There are problems with the query " + query, "Ошибка!", JOptionPane.ERROR_MESSAGE);
		}
		return retVector;
	}
	
	// Функция SQL-запроса для обновления таблицы
	// На входе: query - SQL-запрос
	// На выходе: Ничего
	public void setNomen(String query)
	{
		try
		{
			Statement st = con.createStatement();
			st.executeUpdate(query);
			st.close();
		}
		catch (SQLException se)
		{
			se.getMessage();
		}
	}
}
В чем может быть проблема?

Заранее спасибо.

P.S. Много гуглил, но ни его советы, ни уже существующая тема на этом форуме (http://programmersforum.ru/showthread.php?t=27464) не помогли.
Osanve вне форума Ответить с цитированием
Старый 23.06.2011, 08:28   #2
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

baza.setNomen("INSER INTO floor (code, state) VALUES ('"+jTextField1.getText()+"', "+jCheckBox1.isSelected()+")");

T забыл
Carbon вне форума Ответить с цитированием
Старый 23.06.2011, 14:09   #3
Osanve
Пользователь
 
Аватар для Osanve
 
Регистрация: 11.12.2010
Сообщений: 50
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
baza.setNomen("INSER INTO floor (code, state) VALUES ('"+jTextField1.getText()+"', "+jCheckBox1.isSelected()+")");

T забыл
Да, точно. Благодарю.

Правда возник теперь другой вопрос. Объект класса KFDB создается следующим образом (код самого класса уже привел):
Код:
baza = new KFDB("com.mysql.jdbc.Driver", "jdbc:mysql://"+server+":3306/"+db+"?useUnicode=true&characterEncoding=UTF-8", name, pwd);
Что надо сделать, чтобы в БД записывать данные кириллицей. Если прописывать SQL-запрос в консоли MySQL, то данные с кириллическими символами записываются, но при выводе в окно программы нарушается кодировка (скрин в аттаче). При добавлении данных с кириллическими символами через программу, в таблицу ничего не заносится.
Изображения
Тип файла: png dgh.PNG (12.1 Кб, 68 просмотров)
Osanve вне форума Ответить с цитированием
Старый 24.06.2011, 09:10   #4
Osanve
Пользователь
 
Аватар для Osanve
 
Регистрация: 11.12.2010
Сообщений: 50
По умолчанию

Пересоздал таблицу следующим образом:
Код:
CREATE TABLE floor (id NOT NULL AUTO_INCREMENT, code TEXT CHARACTER SET utf8, state BOOL NOT NULL, PRIMARY KEY(id));
После этого данные в кириллическом виде через программу добавляются и нормально выводятся, но при запросе
Код:
SELECT * FROM floor;
из консоли MySQL вместо букв выводятся знаки вопроса (скрин в аттаче). Это нормально и будут-ли нормально отображаться данные, допустим после обращения к этой же таблице через PHP-скрипт?

Также возник вопрос: как можно организовать обновление двух окон (т.е. допустим через окно "Добавить рекламное место" создаем еще одну запись в таблице, после чего таблица в окне "Управление рекламными местами" обновляется, а в окне "Зеркала-сервер" обновляется JLabel)?
Изображения
Тип файла: jpg dts.jpg (54.1 Кб, 127 просмотров)
Osanve вне форума Ответить с цитированием
Старый 24.06.2011, 10:03   #5
X@OC
Форумчанин
 
Аватар для X@OC
 
Регистрация: 18.06.2010
Сообщений: 273
По умолчанию

Самый простой способ это через файл
У меня тоже была проблема с передачей из одного JPanel в другой JPanel

Я сделал метод Buff в который передавал все необходимые параметры через файл
в первом все записывал, а во втором все забирал и и очищал файл.
X@OC вне форума Ответить с цитированием
Старый 24.06.2011, 10:08   #6
Osanve
Пользователь
 
Аватар для Osanve
 
Регистрация: 11.12.2010
Сообщений: 50
По умолчанию

Цитата:
Сообщение от X@OC Посмотреть сообщение
Я сделал метод Buff в который передавал все необходимые параметры через файл
в первом все записывал, а во втором все забирал и и очищал файл.
Спасибо. Попробую.
Osanve вне форума Ответить с цитированием
Старый 24.06.2011, 10:24   #7
Fox
линуксоид
Форумчанин
 
Аватар для Fox
 
Регистрация: 02.11.2006
Сообщений: 157
По умолчанию

а у вас в консоле случаем не cp866, а вы ей utf-8 предлагаете! =)
В виндовой консоле вы больше не увидете коректной кирилицы.
Fox вне форума Ответить с цитированием
Старый 24.06.2011, 11:20   #8
Osanve
Пользователь
 
Аватар для Osanve
 
Регистрация: 11.12.2010
Сообщений: 50
По умолчанию

Цитата:
Сообщение от Fox Посмотреть сообщение
а у вас в консоле случаем не cp866, а вы ей utf-8 предлагаете! =)
В виндовой консоле вы больше не увидете коректной кирилицы.
Мне это буквально только что разъяснили Но фишка в том, что потом к этой БД будут обращаться помимо программы скрипты с сайта. Халтурку знаете-ли в конце сессии подкинули. Опыт программирования на Java только для Android. Опыт работы с MySQL только под Linux. Опыт работы с виндовой консолью почти никакой

Что-то никак не удается мне нормально подружиться со связкой Java + MySQL
Выполняется код:
Код:
saveBt.addActionListener(new java.awt.event.ActionListener()
{
	@Override
	public void actionPerformed(ActionEvent e)
	{
		for(int i = 0; i < table.getRowCount(); i++)
		{
			baza.setNomen("UPDATE floor SET code='"+table.getValueAt(i, 1).toString()+"', state="+table.getValueAt(i, 2)+"WHERE id="+table.getValueAt(i, 0));
		}
	}
});
При этом данные в таблице не обновляются. При вводе SQL-запроса в консоли, например:
Код:
UPDATE floor SET code='ololo', state=true WHERE id=12;
все работает нормально.
Может я опять букву забыл пропечатать где-то? Но ошибки в упор не вижу.
Заранее спасибо.
Osanve вне форума Ответить с цитированием
Старый 24.06.2011, 14:52   #9
Osanve
Пользователь
 
Аватар для Osanve
 
Регистрация: 11.12.2010
Сообщений: 50
По умолчанию

Нашел ошибку:
Код:
baza.setNomen("UPDATE floor SET code='"+table.getValueAt(i, 1).toString()+"', state="+table.getValueAt(i, 2)+"<здесь ставим пробел>WHERE id="+table.getValueAt(i, 0));
Osanve вне форума Ответить с цитированием
Старый 24.06.2011, 23:27   #10
Osanve
Пользователь
 
Аватар для Osanve
 
Регистрация: 11.12.2010
Сообщений: 50
По умолчанию

Ну чтож. Осталось сделать синхронизацию данных в разных JFrame (за это прока не прался) и еще одну вещь о которой сейчас расскажу.
Программа будет использоваться как администратором, так и обычными юзерами, следовательно должна быть функция добавления новых пользователей, но доступная не всем.
Очевидно, что самый простой вариант - деактивировать объект JButton по условию
Код:
jButton3.setEnabled(false);
Но тут возникает проблема. Мы не можем точно знать логины всех администраторов СУБД. Создавать отдельную таблицу с логинами, на мой взгляд, не очень хорошая идея. Допустим, что мы поставим следующее условие:
Код:
if(baza.getNomen("SELECT User FROM mysql.db WHERE User='"+name+"'").size() != 0)
{
	jButton3.setEnabled(false);
}
else
{
	jButton3.addActionListener(new java.awt.event.ActionListener()
	{
		@Override
		public void actionPerformed(ActionEvent e)
		{
			new Managers(baza);
		}
	});
}
Тогда получается следующее: при входе под аккаунтом root'а все работает нормально (возможность управления аккаунтами активирована), а вот при входе под аккаунтом обычного юзера, после соединения с БД выскакивает ошибка о том, что невозможно произвести данный SQL-запрос (что логично) и только потом осуществляется запуск основного окна программы (возможность управления аккаунтами деактивирована).
Возникает вопрос: как иначе можно проверить под какой учетной записью был осуществлен вход, либо как можно избавиться от данной ошибки без нарушения функционала (вывод ошибки через showMessageDialog прописан в методе getNomen класса KFDB, с целью предотвращения других возможных неверных SQL-запросов)?
Заранее спасибо.
Osanve вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос вида Insert..Select MySQL Svap SQL, базы данных 3 11.01.2011 19:11
Windows7,не работает HKEY_LOCAL_MACHINE\SOFTWARE\Microso ft\Windows NT\CurrentVersion\Windows\AppInit_D LLs ассемблер123 Windows 0 22.04.2010 18:30
java + mysql Lemon2009 Java Базы данных (JDBC, JPA, Hibernate) 5 09.03.2010 14:20
База Данных MySql не выполняется INSERT INTO vasylshvv Java Базы данных (JDBC, JPA, Hibernate) 6 04.08.2009 10:16
mysql проблемы с INSERT proglamer PHP 4 30.03.2008 14:36