/* * JEF - Copyright 2009-2010 Jiyi (mr.jiyi@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jef.database.dialect; import java.sql.SQLException; import java.sql.Types; import jef.database.ConnectInfo; import jef.database.dialect.handler.LimitHandler; import jef.database.dialect.handler.SQL2005LimitHandler; import jef.database.dialect.handler.SQL2005LimitHandlerSlowImpl; import jef.database.exception.JDBCExceptionHelper; import jef.database.exception.ViolatedConstraintNameExtracter; import jef.database.jdbc.statement.UnionJudgement; import jef.database.query.function.NoArgSQLFunction; import jef.tools.string.JefStringReader; /** * 修改列名SQLServer:exec sp_rename't_student.name','nn','column'; sp_rename:SQLServer 内置的存储过程,用与修改表的定义。 * @author jiyi * * * SQL Server 2005 (9.x), SQLSever 2008(10.0.x), 2008 R2(10.5.x)可以使用此方言。 * */ public class SQLServer2005Dialect extends SQLServer2000Dialect{ public SQLServer2005Dialect() { super(); typeNames.put(Types.BLOB, "varbinary(MAX)", Types.VARBINARY); typeNames.put(Types.VARBINARY, "varbinary(MAX)", 0); typeNames.put(Types.VARBINARY, 8000, "varbinary($l)", 0); typeNames.put(Types.LONGVARBINARY, "varbinary(MAX)", 0); typeNames.put(Types.CLOB, "varchar(MAX)", Types.VARCHAR); typeNames.put(Types.LONGVARCHAR, "varchar(MAX)", Types.VARCHAR); typeNames.put(Types.VARCHAR, "varchar(MAX)",0); typeNames.put(Types.VARCHAR, 8000, "varchar($l)",0); typeNames.put(Types.BIT, "bit",0); registerNative(new NoArgSQLFunction("row_number")); } public void parseDbInfo(ConnectInfo connectInfo) { JefStringReader reader=new JefStringReader(connectInfo.getUrl()); reader.setIgnoreChars(' '); reader.consumeIgnoreCase("jdbc:sqlserver:"); reader.consumeChars('@','/'); String host=reader.readToken(':','/'); connectInfo.setHost(host); if(reader.omitAfterKeyIgnoreCase("databasename=", ' ')!=-1){ String dbname=reader.readToken(' ',';',':'); connectInfo.setDbname(dbname); } reader.close(); } @Override public String generateUrl(String host, int port, String pathOrName) { StringBuilder sb=new StringBuilder("jdbc:"); //jdbc:sqlserver:localhost:1433; DatabaseName =allandb sb.append("sqlserver:"); sb.append("//").append(host).append(":").append(port<=0?1433:port); sb.append("; DatabaseName=").append(pathOrName); String url=sb.toString(); return url; } public String getDriverClass(String url) { return "com.microsoft.sqlserver.jdbc.SQLServerDriver"; } @Override protected LimitHandler generateLimitHander() { if(UnionJudgement.isDruid()){ return new SQL2005LimitHandler(); }else{ return new SQL2005LimitHandlerSlowImpl(); } } private static ViolatedConstraintNameExtracter EXTRATER=new ViolatedConstraintNameExtracter(){ @Override public String extractConstraintName(SQLException sqle) { int sqlState = Integer.valueOf(JDBCExceptionHelper.extractSqlState(sqle)).intValue(); switch (sqlState) { case 23000: return sqle.getMessage(); } return null; } }; @Override public ViolatedConstraintNameExtracter getViolatedConstraintNameExtracter() { return EXTRATER; } }