I am working on a program that manages a database of client information. I am currently stuck on a problem where the SQL statement created by my java program but get the error
SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO Contact VALUES ("82136b4240d6ce4ea7d03e51469a393b","b","b","b","b","' at line 2 SQLState: 42000 VendorError: 1064
I would figure that the statement is incorrect, but if I run it in Workbench, it works exact. The SQL statement I am using is as follows (merged into one string with \n for each line)
Begin;
INSERT INTO Contact VALUES ("82136b4240d6ce4ea7d03e51469a393b","b","b","b","b","b","b","b","b","b","b") ON DUPLICATE KEY UPDATE ContactID=ContactID;
INSERT INTO Contact VALUES ("e9b3390206d8dfc5ffc9b09284c0bbde","c","c","c","c","c","c","c","c","c","c") ON DUPLICATE KEY UPDATE ContactID=ContactID;
INSERT INTO People (UID,LastName,FirstName,MiddleName,MadenName,AncestryID,23MeID,GedMatchID,ContactID,BusinessContactID,Notes,Deceased)Values ("a4057edb4d8205f3361c9ca350f67c1f","a","a","a","a","a","a","a","82136b4240d6ce4ea7d03e51469a393b","e9b3390206d8dfc5ffc9b09284c0bbde","",false) ON DUPLICATE KEY UPDATE UID=UID;
COMMIT;
As a quick testing I have a command SELECT 1 + 1; which seems to work just fine
It may help for some people to have the creation code for the tables. The two relevant are as follow
CREATE TABLE IF NOT EXISTS `clients`.`Contact` (
`ContactID` VARCHAR(32) NOT NULL COMMENT 'Hashed number',
`Address` VARCHAR(45) NOT NULL,
`Street` VARCHAR(45) NOT NULL,
`City` VARCHAR(25) NOT NULL,
`State` VARCHAR(2) NOT NULL,
`Zipcode` VARCHAR(5) NOT NULL,
`HPhone` VARCHAR(10) NULL COMMENT 'HomePhone',
`CPhone` VARCHAR(10) NULL,
`Website` VARCHAR(45) NULL,
`BuisnessName` VARCHAR(45) NULL,
`BuisnessWebsite` VARCHAR(45) NULL,
UNIQUE INDEX `ContactID_UNIQUE` (`ContactID` ASC),
PRIMARY KEY (`ContactID`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `clients`.`People`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `clients`.`People` ;
CREATE TABLE IF NOT EXISTS `clients`.`People` (
`UID` VARCHAR(32) NOT NULL,
`LastName` VARCHAR(45) NOT NULL,
`FirstName` VARCHAR(25) NOT NULL,
`MiddleName` VARCHAR(45) NOT NULL,
`MadenName` VARCHAR(45) NOT NULL,
`AncestryID` VARCHAR(15) NOT NULL COMMENT 'KitID',
`23MeID` VARCHAR(15) NOT NULL COMMENT 'KitID',
`GedMatchID` VARCHAR(9) NOT NULL,
`ContactID` VARCHAR(32) NOT NULL,
`BusinessContactID` VARCHAR(32) NOT NULL,
`Notes` BLOB NULL,
`Deceased` TINYINT(1) NULL,
PRIMARY KEY (`UID`),
UNIQUE INDEX `23MeID_UNIQUE` (`23MeID` ASC),
UNIQUE INDEX `GedmatchID_UNIQUE` (`GedMatchID` ASC),
UNIQUE INDEX `UID_UNIQUE` (`UID` ASC),
INDEX `fk_People_Contact1_idx` (`ContactID` ASC),
INDEX `fk_People_Contact2_idx` (`BusinessContactID` ASC),
UNIQUE INDEX `AncestryID_UNIQUE` (`AncestryID` ASC),
CONSTRAINT `fk_People_Contact1`
FOREIGN KEY (`ContactID`)
REFERENCES `clients`.`Contact` (`ContactID`)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `fk_People_Contact2`
FOREIGN KEY (`BusinessContactID`)
REFERENCES `clients`.`Contact` (`ContactID`)
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
As asked here is the java function I use to send the query
public int SQLAddTo(String FinalQuery, String userName, String password) {
Connection conn = null;
Statement stmt = null;
txtStatus.setText("Processing");
int intrs = 0;
try {
conn
= DriverManager.getConnection("jdbc:mysql://10.0.0.249:3306/clients", userName, password);
stmt = conn.createStatement();
intrs = stmt.executeUpdate(FinalQuery);
txtStatus.setText("Done");
// Now do something with the ResultSet ....
} catch (SQLException ex) {
// handle any errors
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
txtStatus.setText("SQLException: " + ex.getMessage());
} finally {
// it is a good idea to release
// resources in a finally{} block
// in reverse-order of their creation
// if they are no-longer needed
if (stmt != null) {
try {
stmt.close();
} catch (SQLException sqlEx) {
} // ignore
stmt = null;
}
}
return intrs;
}
And the creation of the SQL statement and sent to the function
String queryContact = "INSERT INTO Contact (ContactID,Address,Street,City,State,Zipcode,Hphone,Cphone,Website,BuisnessName,BuisnessWebsite) "
+ "VALUES ('" + ContactH1 + "','" + txtAddress.getText() + "','" + txtStreet.getText() + "','" + txtCity.getText() + "','" + txtState.getText() + "','" + txtZip.getText() + "','"
+ txtHP.getText() + "','" + txtCP.getText() + "','" + txtWeb.getText() + "','" + txtBName.getText() + "','" + txtBW.getText() + "') ON DUPLICATE KEY UPDATE ContactID=ContactID;";
String queryBContact = "INSERT INTO Contact (ContactID,Address,Street,City,State,Zipcode,Hphone,Cphone,Website,BuisnessName,BuisnessWebsite) "
+ "VALUES ('" + ContactH2 + "','" + txtAddress1.getText() + "','" + txtStreet1.getText() + "','" + txtCity1.getText() + "','" + txtState1.getText() + "','" + txtZip1.getText() + "','"
+ txtHP1.getText() + "','" + txtCP1.getText() + "','" + txtWeb1.getText() + "','" + txtBName1.getText() + "','" + txtBW1.getText() + "') ON DUPLICATE KEY UPDATE ContactID=ContactID;";
String People = txtLN.getText() + txtFN.getText() + txtMN.getText() + txtMadN.getText() + txtAncID.getText() + txt23ID.getText()
+ txtGedID.getText() + ContactH1 + ContactH2 + txtNote.getText() + cbDead.isSelected();
String PeopleH = MD5(People);
//Final Query statement
String FinalQuery = "Begin;\n\r" + queryContact + "\n\r" + queryBContact + "\n\r" + queryPeople + "\n\r"
+ queryDonations + "\n\r" + queryMembers + "\n\r" + queryAncAccess + "\n\r" + queryAncesty + "\n\r" + query23Access + "\n\r"
+ query23 + "\n\r" + queryGedAccess + "\n\r" + queryGed + "\n\rCOMMIT;";
System.out.println(FinalQuery);
//Execute SQL connection
int Result = SQLAddTo(FinalQuery, "travis", "password");
insert
statement should be executed as a separate call toStatement.executeUpdate
(and as far as I remember it should be no semicolon ). So you are getting connection object, set autoCommit to false, create a prepared statement object, execute inserts, and then commit (connection.commit)