package jef.database; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Date; import jef.database.dialect.ColumnType; import jef.database.jsqlparser.parser.ParseException; import jef.database.jsqlparser.visitor.Expression; import jef.database.meta.TupleMetadata; import jef.database.query.Func; import jef.database.test.DataSource; import jef.database.test.DataSourceContext; import jef.database.test.DatabaseInit; import jef.database.test.IgnoreOn; import jef.database.test.JefJUnit4DatabaseTestRunner; import jef.orm.onetable.model.CaAsset; import jef.tools.string.RandomData; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(JefJUnit4DatabaseTestRunner.class) @DataSourceContext({ @DataSource(name = "oracle", url = "${oracle.url}", user = "${oracle.user}", password = "${oracle.password}"), @DataSource(name = "mysql", url = "${mysql.url}", user = "${mysql.user}", password = "${mysql.password}"), @DataSource(name = "postgresql", url = "${postgresql.url}", user = "${postgresql.user}", password = "${postgresql.password}"), @DataSource(name = "hsqldb", url = "jdbc:hsqldb:mem:testhsqldb", user = "sa", password = ""), @DataSource(name = "derby", url = "jdbc:derby:./db;create=true"), @DataSource(name = "sqlite", url = "jdbc:sqlite:test.db?date_string_format=yyyy-MM-dd HH:mm:ss"), @DataSource(name = "sqlserver", url = "${sqlserver.url}",user="${sqlserver.user}",password="${sqlserver.password}") }) public class TestStringDataLength extends org.junit.Assert { private DbClient db; @DatabaseInit public void setup() throws SQLException { TupleMetadata meta = new TupleMetadata("XX"); meta.addColumn("id", new ColumnType.Int(3)); meta.addColumn("num", new ColumnType.Int(3)); meta.addColumn("data", new ColumnType.Varchar(50)); db.createTable(meta); } /** * * @throws Exception */ @IgnoreOn({ "mysql", "postgresql", "hsqldb", "derby" }) @Test public void testDbInfo() throws Exception { byte[] v = RandomData.randomByteArray(50); System.out.println("========== US-ASCII ==========="); try { String s = new String(v, "US-ASCII"); db.executeSql("insert into XX(ID,NUM,DATA) values(1,3,?)", s); } catch (SQLException e) { String message = e.getMessage(); System.out.println(message); // ORA-12899: 列 "POMELO"."XX"."DATA" 的值太大 (实际值: 75, 最大值: 50) } System.out.println("========== iso-8859-1 ==========="); try { String s = new String(v, "iso-8859-1");// 70 db.executeSql("insert into XX(ID,NUM,DATA) values(1,3,?)", s); } catch (SQLException e) { String message = e.getMessage(); System.out.println(message); // ORA-12899: 列 "POMELO"."XX"."DATA" 的值太大 (实际值: 74, 最大值: 50) } System.out.println("========== gb18030 ==========="); try { String s = new String(v, "gb18030");// 成功 db.executeSql("insert into XX(ID,NUM,DATA) values(1,3,?)", s); } catch (SQLException e) { String message = e.getMessage(); System.out.println(message); // ORA-12899: 列 "POMELO"."XX"."DATA" 的值太大 (实际值: 51, 最大值: 50) } } @Test public void testParse() throws ParseException { // String s="nvl(columnA,columnB)"; // String s="columnA || 'vv'"; String s = "concat(columnA , 'vv')"; Expression ex = DbUtils.parseExpression(s); // Expression ex1=DbUtils.parseBinaryExpression(s); System.out.println(ex); } @IgnoreOn({ "mysql", "oracle", "hsqldb", "derby" ,"sqlite"}) @Test public void testPostgresqlSavePoints() throws Exception { db.dropTable(CaAsset.class); db.createTable(CaAsset.class); CaAsset t1 = RandomData.newInstance(CaAsset.class); try{ db.insert(t1); }catch(SQLException e){ e.printStackTrace(); } Transaction session = db.startTransaction(); {//故意出錯 CaAsset t2 = RandomData.newInstance(CaAsset.class); t2.setAssetId(t1.getAssetId()); PreparedStatement stmt = session.selectTarget(null).prepareStatement("insert into ca_asset(normal,acct_id,asset_type,valid_date,asset_id) values(?,?,?,?,?)"); try { stmt.setString(1, "廖丘"); stmt.setInt(2, 20474239); stmt.setInt(3, 109); stmt.setDate(4, new java.sql.Date(12333)); stmt.setLong(5, t1.getAssetId()); stmt.executeUpdate(); } catch (Exception e) { System.out.println(e.getMessage()); } finally { stmt.close(); } } { try {//故意出錯 session.selectBySql("select current_timestamp from dual", Date.class); } catch (Exception e) { e.printStackTrace(); } } System.out.println("===" + session.getExpressionValue(Func.current_timestamp, Object.class)); session.commit(true); } @Test public void getCurrentTimestamp() throws SQLException{ Date d=db.getExpressionValue(Func.current_timestamp, Date.class); System.out.println(d); } }