您好,我正在与JAVA合作,制作了一个可以从文本文件直接插入数据库的swt应用程序。我只是在为应用程序的最后一部分(错误检测部分)而苦苦挣扎。我可以很好地插入数据库,并且在应该出现的地方给出错误。我想做的就是做到这一点,如果有多个错误,它将指出存在多个错误,而不仅仅是一个错误。现在,我的代码仍然将文本文件的正确行插入数据库,并且没有插入错误的行,但仅标记了一个错误。有没有办法将if语句放在catch子句周围,还是有一种更有效的方法来识别多个错误?我想对所有SQL异常(例如错误的字段,不正确的值类型等)执行此操作。
buttoninsert.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
System.out.println("create jdbc connection using properties file");
Connection con = null;
// use try becuase it tends to fail sometimes and we want error messages
try {
//load properties file we have created
Properties prop = loadPropertiesFile();
//declare vars and get the properties at the same time
String driverClass = prop.getProperty("SQLSERVERJDBC.driver");
String url = prop.getProperty("SQLSERVERJDBC.url");
String username = prop.getProperty("SQLSERVERJDBC.username");
String password = prop.getProperty("SQLSERVERJDBC.password");
// have to instance driver
Class.forName(driverClass).newInstance();
// make connection object using the previous things as parameters
con = DriverManager.getConnection(url, username, password);
//this if is to verify the connection
if (con != null) {
System.out.println("connection created successfully using properties file");
}
else {
System.out.println(" unable to create connection");
}
BufferedReader reader = new BufferedReader(new FileReader(
"C:\\Users\\darroyo\\Documents\\pruebasx.txt"));
ArrayList<String> array1 = new ArrayList<String>();
// Read line from file.
while (true) {
String line = reader.readLine();
if (line == null) {
break;
}
// Split line on space.
String[] parts = line.split("");
//part in parts
for (String part : parts) {
//part is the element in this case each fix tag with value
array1.add(part);
}
String query = " insert into FRONTMC.HECHO (folio_hecho, folio_orden, emisora, serie,"
+ "clave_sentido, titulos_hecho, precio, importe, liquidacion, contraparte, id_estatus, isin, contrato,"
+ "secondary_exec_id, exec_id, F11_ClOrdID, fecha_recepcion, fecha_sentra)"
+ " values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,convert(varchar(30),cast(? as datetime),120),convert(varchar(30),cast(? as datetime),120))";
// create the mysql insert preparedstatement
PreparedStatement preparedStmt = con.prepareStatement(query);
for(int counter =0; counter< array1.size();counter++){
if(array1.get(counter).substring(0, 3).equals("37=")){
preparedStmt.setString (1, array1.get(counter).substring(3));
}
if(array1.get(counter).substring(0, 3).equals("37=")){
preparedStmt.setString (2, array1.get(counter).substring(3));
}
// change emisora and serie to 48 with bd
if(array1.get(counter).substring(0, 3).equals("49=")){
preparedStmt.setString (3, array1.get(counter).substring(3));
}
if(array1.get(counter).substring(0, 4).equals("447=")){
preparedStmt.setString (4, array1.get(counter).substring(4));
}
if(array1.get(counter).substring(0, 3).equals("54=")){
preparedStmt.setString (5, array1.get(counter).substring(3));
}
if(array1.get(counter).substring(0, 3).equals("32=")){
preparedStmt.setString (6, array1.get(counter).substring(3));
}
if(array1.get(counter).substring(0, 3).equals("31=")){
preparedStmt.setString (7, array1.get(counter).substring(3));
}
if(array1.get(counter).substring(0, 4).equals("381=")){
preparedStmt.setString (8, array1.get(counter).substring(4));
}
if(array1.get(counter).substring(0, 3).equals("63=")){
preparedStmt.setString (9, array1.get(counter).substring(3));
}
if(array1.get(counter).substring(0, 4).equals("448=")){
preparedStmt.setString (10, array1.get(counter).substring(4));
}
if(array1.get(counter).substring(0, 4).equals("150=")){
preparedStmt.setString (11, array1.get(counter).substring(4));
}
if(array1.get(counter).substring(0, 3).equals("48=")){
preparedStmt.setString (12, array1.get(counter).substring(3));
}
if(array1.get(counter).substring(0, 2).equals("1=")){
preparedStmt.setString (13, array1.get(counter).substring(2));
}
if(array1.get(counter).substring(0, 4).equals("527=")){
preparedStmt.setString (14, array1.get(counter).substring(4));
}
if(array1.get(counter).substring(0, 3).equals("17=")){
preparedStmt.setString (15, array1.get(counter).substring(3));
}
if(array1.get(counter).substring(0, 3).equals("11=")){
preparedStmt.setString (16, array1.get(counter).substring(3));
}
if(array1.get(counter).substring(0, 3).equals("52=")){
String date = array1.get(counter).substring(3);
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat sdf2 = new SimpleDateFormat("dd/MM/yyyy");
String ds2 = sdf2.format(sdf1.parse(date));
String x = date.substring(9, 21);
String newfecha1 = ds2+" "+x;
preparedStmt.setString (17, newfecha1);
}
if(array1.get(counter).substring(0, 3).equals("52=")){
String date = array1.get(counter).substring(3);
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat sdf2 = new SimpleDateFormat("dd/MM/yyyy");
String ds2 = sdf2.format(sdf1.parse(date));
String x = date.substring(9, 21);
String newfecha1 = ds2+" "+x;
preparedStmt.setString (18, newfecha1);
}
}
// execute the preparedstatement
preparedStmt.execute();
displaymsjfix.setText("exitoso");
}
System.out.println(array1);
reader.close();
//creating the statement(should check to use prepared statement in the future
// fecha recp y fecha sentra in query and for and ? and order
//notifies you that it was completed
System.out.println("insert complete");
// loop to check the digits ex. for() array.1get(counter).substring(0,3).equals("23=")
//error messages
}catch (SQLException eb) {
eb.printStackTrace();
}
//ERROR MESSAGE FECHA just get line number
catch (Exception eb) {
System.out.println("Error in date ");
} finally {
try {
if (con != null) {
con.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
});
答案 0 :(得分:0)
您不会抛出多个错误,因为一个方法只能抛出一个异常,而SQL连接器只会在第一个异常快速失败。我认为您所追求的是如何捕获各种错误并向用户显示这些错误?
您可以解析SQLException中返回的消息字符串,然后显示更详细的错误消息?
答案 1 :(得分:0)
执行查询时,您只会在SQLException中获得最优先的错误(它找到的第一个错误),类似于在数据库本身上以本机SQL执行查询时所得到的错误(因此不能通过Java代码,但通过SQLDeveloper或类似的SQL工具)。
对于您而言,我能给您的最佳选择是:
.setString
。 在当前代码中,将所有值作为String插入数据库。通常,您只想对.setString
和TEXT
值使用VARCHAR
。如果数据库值为NUMERIC
,建议使用.setInteger
或.setLong
(或其他取决于NUMERIC的大小)。如果所有Java字段都只是字符串,从您使用的许多substrings
来看,情况似乎如此,则可以先在Java代码中将这些字符串转换为Integers,然后在PreparedStatement上使用.setInteger
。
它并不能真正回答您的问题,但至少您不会再出现不正确的值类型错误。
如果您使用convert(varchar(30),cast(? as datetime),120)
而不是?
,则查询的.setDate
部分可能是.setString
(我认为不是100%肯定,因为我不是确定您的输入数据是什么,以及由PreparedStatement生成的查询是什么。可能您仍然需要配置一些内容,以便在默认情况下不执行此操作以将其转换为正确的数据库日期格式)
答案 2 :(得分:0)
如果要列出所有错误,请在try-catch
内while-loop
,而不是外部。
List<String> errors
答案 3 :(得分:0)
从您的行“现在,我的代码仍然将文本文件的正确行插入数据库,并且没有插入错误的行,但仅标记了一个错误”,我假设您要继续触发sqlqueries直到最后一行,并收集出现的所有错误消息。
您不应该这样做,这是一个不好的做法,但是我认为在Java语言中有一种方法。
List<String> exceptionList = new ArrayList<String>();
while(true)
{
//Your code
try
{
//sql statements and prepared statements
}
catch(SqlException e)
{
exceptionList.add(e.getMessage());
continue;
}
}