Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将日期插入Access DB时出现问题-由于时间更改而不存在小时_Java_Sql_Date_Ms Access_Bulkinsert - Fatal编程技术网

Java 将日期插入Access DB时出现问题-由于时间更改而不存在小时

Java 将日期插入Access DB时出现问题-由于时间更改而不存在小时,java,sql,date,ms-access,bulkinsert,Java,Sql,Date,Ms Access,Bulkinsert,我正在编写一个导入例程,将excel中的测量数据插入access。在我的excel输入文件中,我得到了每小时的值,忽略了夏令时的时间更改,因此每个日期都将比前一个日期晚1小时。没有重复,没有遗漏日期 现在,我使用poi读取数据,然后尝试使用准备好的语句将数据批量插入Access数据库。但在执行批处理时,我总是遇到一个常规错误。查看数据库,我看到在“2011.03.27 01:00”之前插入的所有数据,但插入的下一个和最后一个日期是“2011.03.27 03:00”,其值对应于我输入数据中的“2

我正在编写一个导入例程,将excel中的测量数据插入access。在我的excel输入文件中,我得到了每小时的值,忽略了夏令时的时间更改,因此每个日期都将比前一个日期晚1小时。没有重复,没有遗漏日期

现在,我使用poi读取数据,然后尝试使用准备好的语句将数据批量插入Access数据库。但在执行批处理时,我总是遇到一个常规错误。查看数据库,我看到在“2011.03.27 01:00”之前插入的所有数据,但插入的下一个和最后一个日期是“2011.03.27 03:00”,其值对应于我输入数据中的“2011.03.27 02:00”

在插入数据时,日期“2011.03.27 02:00”会隐式转换为“2011.03.27 03:00”(无警告或错误),并且由于我的日期列标记为主键,因此在尝试插入实际的3点钟数据时,插入失败

有没有办法防止这种转换发生?我知道日期“2011.03.27 02:00”不存在(或至少等于“2011.03.27 03:00”),但为了数据的一致性,我需要正确插入该日期

这是我的密码:

        myDBConn = DriverManager.getConnection("jdbc:odbc:mydb");
        state = myDBConn.prepareStatement("Insert into myTable values(?,?,?)");
        for(int i=0;i<numberOfObjects;i++){
            state.clearBatch();
            for(int j=0;j<numberOfHours;j++){
                state.setString(1,names[i]);
                state.setTimestamp(2,dates[j]);
                state.setDouble(3, data[i][j]);
                state.addBatch();
            }
            state.executeBatch();
        }
        state.close();
        myConn.close();
myDBConn=DriverManager.getConnection(“jdbc:odbc:mydb”);
状态=myDBConn.prepareStatement(“插入myTable值(?,?)”;

对于(int i=0;i避免时区/DST问题最直接的方法可能是直接将Excel数据导入Access数据库,完全绕过Java
Date
的复杂性。给定一个名为“measurements.xls”的Excel文件,其中包含“Sheet1”中的以下数据

还有一个名为“myDb.mdb”的新的空Access数据库,下面的Java代码将使用旧的Microsoft Access ODBC(Jet)驱动程序将Excel数据直接导入Access

import java.sql.*;
公共类ImportFromExcelMain{
公共静态void main(字符串[]args){
试一试{
Connection con=DriverManager.getConnection(
“jdbc:odbc:Driver={Microsoft Access驱动程序(*.mdb)};”+
“DBQ=C:\\\\\uu tmp\\test\\measurements\\myDb.mdb;”;
语句st=con.createStatement();
圣执行(
“选择*进入myTable”+
“从[Excel 8.0;HDR=YES;IMEX=2;数据库=C:\\\\\\\\\\\\\\\ tmp\\test\\measurements\\measurements.xls]。[Sheet1$];”;
圣克洛斯();
con.close();
}捕获(SQLE异常){
e、 printStackTrace();
}
}
}
因此,在访问方面:

编辑回复:新信息

直接导入原始Excel数据(以避免日期混乱)然后“取消归档”可能更容易。以下修改后的代码已使用类似以下的Excel工作表进行了测试:

以及具有以下结构的现有访问表

import java.sql.*;
导入java.util.*;
公共类ImportFromExcelMain{
公共静态void main(字符串[]args){
试一试{
Connection con=DriverManager.getConnection(
“jdbc:odbc:Driver={Microsoft Access驱动程序(*.mdb)};”+
“DBQ=C:\\\\\uu tmp\\test\\measurements\\myDb.mdb;”;
语句st=con.createStatement();
试一试{
st.execute(“删除表[excelImport]”);
}捕获(例外e){
如果(!e.getMessage().contains)(“表'excelImport'不存在。”)
投掷(e);
}
//将原始数据从Excel直接导入Access
圣执行(
“在[excelImport]中选择*+
“从[Excel 8.0;HDR=YES;IMEX=2;数据库=C:\\\\\\\\\\\\\\\ tmp\\test\\measurements\\measurements.xls]。[Sheet1$];”;
//抓取一个空结果集,以便我们可以查看列名
st.execute(“从Excel导入中选择*,其中为False”);
ResultSet rs=st.getResultSet();
ResultSetMetaData rsmd=rs.getMetaData();
String timeStampColumnName=rsmd.getColumnName(1);
//在列表中收集列名称2到n
ArrayList columnNames=新的ArrayList();

对于(int i=2;i您可能不应该以特定于时区的格式存储,更适合使用UTC之类的格式,因为它是通用的,不会受到夏令时之类的影响。请参阅:我想尝试一下,但我应该以何种格式存储日期?我不能在批量插入语句中使用joda.DateTime,因为它只接受日期或时间戳。有没有办法在java中创建一个非时区特定的日期或时间戳?谢谢你的回答。不幸的是,这并不能解决我的问题,因为我不仅仅是从Excel复制数据到Access,而且还更改了格式。我的输入是一个n time m表,而n是时间戳数,m是数字对于每个时间戳都有测量数据的对象。但在我的数据库中,它应该生成一个(n*m)乘以3的表,其中每个条目看起来像“Date,Measured_by,Value”@DCircle那么您的Excel数据看起来像什么?是的,完全正确!在我的数据库中,它应该像您的第一个屏幕截图,主键设置为“someText”,并且“someDateTime”而“someText”将是测量站的ID。我用我的数据库和excel工作表尝试了您的代码,但出现以下错误:
java.sql.SQLException:[Microsoft][ODBC Microsoft Access Driver]AllgeMiner Fehler RegistrieRungschlüssel'临时(volatile)进程0x1d34线程0x2754 DBC 0x2e64fbc Jet'kann nicht geöffnet werden的Jet DSN。
它说上面提到的注册表项无法打开。抱歉,但对于odbc驱动程序,我有点经验不足。我需要先“注册”Jet驱动程序吗?@DCircle我不时看到这个错误,我们