2016-10-25 3 views
1

Я работаю над проектом, который потребует расчетов по датам. Я ищу способ сохранить дату как объект внутри базы данных доступа, но каждый метод дает ошибку. Я использую драйвер UcanAccess с Java 8.Вставка даты как объекта Date в базу данных с использованием Java 8?

Мой раздели Код:

//========================== SetupDB =====================================// 
public void setupDB() { 
    try { 
     Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); 
     c1 = DriverManager.getConnection(ABDebatePro.DBURL); 
     stmt = c1.createStatement(); 
    } 
catch (Exception e) { 
     System.out.println(e); 
} 
} 
//========================== InsertDB ====================================// 
public void insertDB(int m, String ft, String st, int s1, int s2, Date d) { 
    MatchNumber = m; 
    FirstTeam = ft; 
    SecondTeam = st; 
    FirstTeamScore = s1; 
    SecondTeamScore = s2; 
    MatchDate = d; 
    setupDB(); 
    try { 
     String sql = "insert into Schedule (MatchNumber, FirstTeam, SecondTeam, FirstTeamScore, SecondTeamScore, MatchDate) values " + "(" + m + ",'" + ft + "','" + st + "'," + s1 + "," + s2+ ",'" + d + "')"; 
     int z = stmt.executeUpdate(sql); 
     c1.close(); 
    } catch (Exception fe) { 
     System.out.println(fe); 
    } 
} 
//========================== Main ========================================// 
public static void main(String[] args) { 
Schedule sch = new Schedule(); 
try { 
    java.sql.Date date1 = java.sql.Date.valueOf("2016-10-25"); 
    sch.insertDB(3, "Turtles", "Aligators", 4, 3, date1); 
} catch (Exception ex) { 
    System.out.println(ex); 
} 

Мой Журнал:

insert into Schedule (MatchNumber, FirstTeam, SecondTeam, FirstTeamScore, SecondTeamScore, MatchDate) values (3,'Turtles','Aligators',4,3,'2016-10-25') 
net.ucanaccess.jdbc.UcanaccessSQLException: data exception: invalid datetime format 

Моя база данных:

Database snapshot

+0

'java.sql.Date' роняет часы, минуты, секунды. В базе данных нет DATE, но DATETIME. Временная метка Java? Или вы можете использовать более удобные java 8-классы LocalDate, LocalDateTime. –

ответ

2

Ваша проблема заключается в том, что вы используете динамический SQL, чтобы построить инструкцию SQL в insertDB, и этот оператор содержит недопустимый литерал даты. Вы должны использовать PreparedStatement и в параметризованный запрос следующим образом:

String sql = 
     "INSERT INTO Schedule " + 
     "(MatchNumber, FirstTeam, SecondTeam, FirstTeamScore, SecondTeamScore, MatchDate) " + 
     "VALUES " + 
     "(?,?,?,?,?,?)" 
PreparedStatement ps = c1.prepareStatement(sql) 
ps.setInt(1, m); 
ps.setString(2, ft); 
ps.setString(3, st); 
ps.setInt(4, s1); 
ps.setInt(5, s2); 
ps.setDate(6, d); 
int z = ps.executeUpdate(); 
+0

Я только что сделал это и поднял вопрос, и вы ответили. Отличная работа! Это прекрасно работает. –

-1

Пример метода для вас:

public void getSqlDate() { 
    Calendar cal = Calendar.getInstance(); 
    int year = 2016; 
    int month = 9; //month is zero-based 
    int day = 25 
    cal.set(year, month, date); 
    return new Date(cal.getTime()); 
} 

Обратите внимание, что конструктор для java.sql.Date действительно хочет длинное значение, представляющее # "миллисекунды с 1 января 1970, 00:00:00 GMT"

См JavaDocs для java.sql.Date

+0

Извините, но это не касается проблемы, а 'java.sql.Date.valueOf (« 2016-10-25 »)' является вполне приемлемым способом создания значения 'java.sql.Date'. –