我正在尝试将新记录写入两个名为项和供应商的数据库表。
我有一个处理数据库连接和SQL语句的类。我在名为ItemEntryScreen的类中使用大型表单,我在使用以下内容:
private void writeItemRecord()
{
if ( DataBaseHandler.makeConnectionTofireplaceDB() == -1)
{
JOptionPane.showMessageDialog (frame, "Unable to connect to database table (Item)");
}
else // Ok, so first read data from the text fields
{
// Read data from form and store data
String suppliercode = suppliercodeTxtField.getText();
String suppliername = suppliernameTxtField.getText();
String address = addressTxtField.getText();
// Create a Item oject
Item item = new Item();
// Set the attributes for the Item object
item.setSuppliercode(suppliercode);
item.setSuppliername(suppliername);
item.setAddress(address);
// Write Item record. Method writeToItemTable() returns
// 0 of OK writing record, -1 if there is a problem. I store
// the returned value in a variable called error.
int error = DataBaseHandler.writeTosupplierTable(item.getSuppliercode(),item.getSuppliername(),item.getAddress());
// Check if there is a problem writing the record, in
// which case error will contain -1
if (error == -1)
{
JOptionPane.showMessageDialog (frame, "Problem writing record to Item Table");
}
// Clear the form - actual method is coded below
clearForm();
// Close database connection. Report an error message
// if there is a problem.
if ( DataBaseHandler.closeConnection() == -1 )
{
JOptionPane.showMessageDialog (frame, "Problem closing data base conection");
}
}
}
/**
* Method to write a Item record
*/
private void writesupplierRecord()
{
// Check to see if we can connect to database table
if ( DataBaseHandler.makeConnectionTofireplaceDB() == -1)
{
JOptionPane.showMessageDialog (frame, "Unable to connect to database table (Item)");
}
else // Ok, so first read data from the text fields
{
// Read data from form and store data
String itemname = itemnameTxtField.getText();
String itemcode = itemcodeTxtField.getText();
String description = descriptionTxtField.getText();
String unitprice = unitpriceTxtField.getText();
String style = styleTxtField.getText();
String finish = finishTxtField.getText();
String stock = stockTxtField.getText();
// Convert priceStr to a float
Float fvar = Float.valueOf(unitprice);
float newprice = fvar.floatValue();
Float svar = Float.valueOf(stock);
float newstock = svar.floatValue();
// Create a Item oject
Item item = new Item();
// Set the attributes for the Item object
item.setItemname (itemname);
item.setItemcode (itemcode);
item.setDescription (description);
item.setUnitprice (newprice);
item.setStock(newstock);
item.setStyle(style);
item.setFinish(finish);
// Write Item record. Method writeToItemTable() returns
// 0 of OK writing record, -1 if there is a problem. I store
// the returned value in a variable called error.
int error = DataBaseHandler.writeToitemTable(item.getItemname(),
item.getItemcode(),
item.getDescription(),
item.getUnitprice(),
item.getStock(),
item.getStyle(),
item.getFinish()
);
// Check if there is a problem writing the record, in
// which case error will contain -1
if (error == -1)
{
JOptionPane.showMessageDialog (frame, "Problem writing record to Item Table");
}
// Clear the form - actual method is coded below
clearForm();
// Close database connection. Report an error message
// if there is a problem.
if ( DataBaseHandler.closeConnection() == -1 )
{
JOptionPane.showMessageDialog (frame, "Problem closing data base conection");
}
}
} // End
以上代码编译!
static public int writeToitemTable(String itemnameIn, String itemcodeIn, String descriptionIn,
float unitpriceIn, float stockIn, String styleIn, String finishIn)
{
// Variable to hold the SQL query
String SQLString;
// Build a string containing the SQL INSERT instruction to be used later
SQLString = "INSERT INTO item VALUES ('" + itemcodeIn + "','" + itemnameIn + "','" + descriptionIn + "','" + unitpriceIn + "','"
+ stockIn + "','" + styleIn + "','" + finishIn + "')";
try
{
// The createStatement() method creates a Statement object. Object will be
// attached to my reference variable (statement) defined at the top of class.
statement = connectionTofireplaceDB.createStatement();
// The executeUpdate() statement can be used here to execute an
// SQL INSERT instruction.
statement.executeUpdate (SQLString);
}
catch (SQLException exception)
{
return (-1); // Return -1 if problem writing record to file
}
return (0); // Return with 0 if record successfully written
} // End
static public int writeTosupplierTable(String suppliernameIn, String suppliercodeIn, String addressIn)
{
// Variable to hold the SQL query
String SQLString;
// Build a string containing the SQL INSERT instruction to be used later
SQLString = "INSERT INTO supplier VALUES ('" + suppliernameIn + "','" + suppliercodeIn + "','" + addressIn + "')";
try
{
// The createStatement() method creates a Statement object. Object will be
// attached to my reference variable (statement) defined at the top of class.
statement = connectionTofireplaceDB.createStatement();
// The executeUpdate() statement can be used here to execute an
// SQL INSERT instruction.
statement.executeUpdate (SQLString);
}
catch (SQLException exception)
{
return (-1); // Return -1 if problem writing record to file
}
return (0); // Return with 0 if record successfully written
} // End
当我在表单中输入详细信息并点击提交按钮时,我得到的返回值为-1,这会导致显示一个消息框,指出写入数据库时出现问题。为什么呢?
更新
这些是我可以得到的错误消息:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at ItemEntryScreen.writeItemRecord(ItemEntryScreen.java:392)
at ItemEntryScreen.actionPerformed(ItemEntryScreen.java:348)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6038)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5803)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
at java.awt.Container.dispatchEventImpl(Container.java:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
答案 0 :(得分:2)
首先,打印stacktrace以查找错误。
其次,由于“声明”,我看到人们遇到这些麻烦。在值即将发生变化的地方使用“PreparedStatement”。如果你提出第二个建议,大概可能会解决你的问题
第三,使用finally()块或其他东西
关闭连接答案 1 :(得分:1)
请查看下面的代码,并尝试将其实现为此....我希望它能够顺利运行..一旦您开始获得所需的查询结果,请将其修改为您的心脏内容以获得更多R& D.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import javax.swing.JTable;
import com.my.views.*;
public class DBDiary {
Connection conn;
EntryDisplay entryD;
public DBDiary(){
this.getConn();
}
public Connection getConn(){
try {
conn = getConnection();
} catch (SQLException e) {
System.out.println("Connection Couldnt be Obtained");
}
return conn;
}
public static Connection getConnection() throws SQLException {
String drivers = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test";
String username = "root";
String password = "root";
System.setProperty(drivers,"");
return DriverManager.getConnection(url,username,password);
}
public void createTable() {
Statement stat = null;
String sql = "create table items(item varchar(30), cost DOUBLE(12,3),day integer,month varchar(15), year integer);";
if (conn != null){
try {
stat = conn.createStatement();
} catch (SQLException e) {
System.out.println("Connection Couldnt be Obtained");
}
if (stat != null){
try {
stat.executeUpdate(sql);
} catch (SQLException e) {
//System.out.println("Table already Exists");
}
}
}
}
public void addItems(String item, double cost,int day, String month, int year) {
PreparedStatement pstat = null;
String sql = "INSERT INTO ITEMS Values(?,?,?,?,?);";
if (conn != null){
try {
pstat = conn.prepareStatement(sql);
} catch (SQLException e) {
System.out.println("Connection Couldnt be Obtained");
}
}
if (pstat != null) {
try {
pstat.setString(1, item);
pstat.setDouble(2, cost);
pstat.setInt(3, day);
pstat.setString(4, month);
pstat.setInt(5,year);
pstat.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("Insertion of the entry was unsuccessful");
}
}
}
public static void main(String[] args) {
DBDiary db = new DBDiary();
db.createTable();
db.addItems("Cards", 40.00,29, "Mar", 2012);
}