📄 tdscore.java
字号:
inBatch = false; } } } /** * Prepares the SQL for use with Microsoft server. * * @param sql the SQL statement to prepare. * @param params the actual parameter list * @param needCursor true if a cursorprepare is required * @param resultSetType value of the resultSetType parameter when * the Statement was created * @param resultSetConcurrency value of the resultSetConcurrency parameter * whenthe Statement was created * @return name of the procedure or prepared statement handle. * @exception SQLException */ String microsoftPrepare(String sql, ParamInfo[] params, boolean needCursor, int resultSetType, int resultSetConcurrency) throws SQLException { // checkOpen(); messages.clearWarnings(); int prepareSql = connection.getPrepareSql(); if (prepareSql == TEMPORARY_STORED_PROCEDURES) { StringBuffer spSql = new StringBuffer(sql.length() + 32 + params.length * 15); String procName = connection.getProcName(); spSql.append("create proc "); spSql.append(procName); spSql.append(' '); for (int i = 0; i < params.length; i++) { spSql.append("@P"); spSql.append(i); spSql.append(' '); spSql.append(params[i].sqlType); if (i + 1 < params.length) { spSql.append(','); } } // continue building proc spSql.append(" as "); spSql.append(Support.substituteParamMarkers(sql, params)); try { submitSQL(spSql.toString()); return procName; } catch (SQLException e) { if ("08S01".equals(e.getSQLState())) { // Serious (I/O) error, rethrow throw e; } // This exception probably caused by failure to prepare // Add a warning messages.addWarning((SQLWarning) Support.linkException( new SQLWarning( Messages.get("error.prepare.prepfailed", e.getMessage()), e.getSQLState(), e.getErrorCode()), e)); } } else if (prepareSql == PREPARE) { int scrollOpt, ccOpt; ParamInfo prepParam[] = new ParamInfo[needCursor ? 6 : 4]; // Setup prepare handle param prepParam[0] = new ParamInfo(Types.INTEGER, null, ParamInfo.OUTPUT); // Setup parameter descriptor param prepParam[1] = new ParamInfo(Types.LONGVARCHAR, Support.getParameterDefinitions(params), ParamInfo.UNICODE); // Setup sql statemement param prepParam[2] = new ParamInfo(Types.LONGVARCHAR, Support.substituteParamMarkers(sql, params), ParamInfo.UNICODE); // Setup options param prepParam[3] = new ParamInfo(Types.INTEGER, new Integer(1), ParamInfo.INPUT); if (needCursor) { // Select the correct type of Server side cursor to // match the scroll and concurrency options. scrollOpt = MSCursorResultSet.getCursorScrollOpt(resultSetType, resultSetConcurrency, true); ccOpt = MSCursorResultSet.getCursorConcurrencyOpt(resultSetConcurrency); // Setup scroll options parameter prepParam[4] = new ParamInfo(Types.INTEGER, new Integer(scrollOpt), ParamInfo.OUTPUT); // Setup concurrency options parameter prepParam[5] = new ParamInfo(Types.INTEGER, new Integer(ccOpt), ParamInfo.OUTPUT); } columns = null; // Will be populated if preparing a select try { executeSQL(null, needCursor ? "sp_cursorprepare" : "sp_prepare", prepParam, false, 0, -1, -1, true); int resultCount = 0; while (!endOfResponse) { nextToken(); if (isResultSet()) { resultCount++; } } // columns will now hold meta data for any select statements if (resultCount != 1) { // More than one result set was returned or none // therefore metadata not available or unsafe. columns = null; } Integer prepareHandle = (Integer) prepParam[0].getOutValue(); if (prepareHandle != null) { return prepareHandle.toString(); } // Probably an exception occured, check for it messages.checkErrors(); } catch (SQLException e) { if ("08S01".equals(e.getSQLState())) { // Serious (I/O) error, rethrow throw e; } // This exception probably caused by failure to prepare // Add a warning messages.addWarning((SQLWarning) Support.linkException( new SQLWarning( Messages.get("error.prepare.prepfailed", e.getMessage()), e.getSQLState(), e.getErrorCode()), e)); } } return null; } /** * Creates a light weight stored procedure on a Sybase server. * * @param sql SQL statement to prepare * @param params the actual parameter list * @return name of the procedure * @throws SQLException if an error occurs */ synchronized String sybasePrepare(String sql, ParamInfo[] params) throws SQLException { checkOpen(); messages.clearWarnings(); if (sql == null || sql.length() == 0) { throw new IllegalArgumentException( "sql parameter must be at least 1 character long."); } String procName = connection.getProcName(); if (procName == null || procName.length() != 11) { throw new IllegalArgumentException( "procName parameter must be 11 characters long."); } // TODO Check if output parameters are handled ok // Check no text/image parameters for (int i = 0; i < params.length; i++) { if (params[i].sqlType.equals("text") || params[i].sqlType.equals("image")) { return null; // Sadly no way } } Semaphore mutex = null; try { mutex = connection.getMutex(); out.setPacketType(SYBQUERY_PKT); out.write((byte)TDS5_DYNAMIC_TOKEN); byte buf[] = Support.encodeString(connection.getCharset(), sql); out.write((short) (buf.length + 41)); out.write((byte) 1); out.write((byte) 0); out.write((byte) 10); out.writeAscii(procName.substring(1)); out.write((short) (buf.length + 26)); out.writeAscii("create proc "); out.writeAscii(procName.substring(1)); out.writeAscii(" as "); out.write(buf); out.flush(); endOfResponse = false; clearResponseQueue(); messages.checkErrors(); return procName; } catch (IOException ioe) { connection.setClosed(); throw Support.linkException( new SQLException( Messages.get( "error.generic.ioerror", ioe.getMessage()), "08S01"), ioe); } catch (SQLException e) { if ("08S01".equals(e.getSQLState())) { // Serious error rethrow throw e; } // This exception probably caused by failure to prepare // Return null; return null; } finally { if (mutex != null) { mutex.release(); } } } /** * Drops a Sybase temporary stored procedure. * * @param procName the temporary procedure name * @throws SQLException if an error occurs */ synchronized void sybaseUnPrepare(String procName) throws SQLException { checkOpen(); messages.clearWarnings(); if (procName == null || procName.length() != 11) { throw new IllegalArgumentException( "procName parameter must be 11 characters long."); } Semaphore mutex = null; try { mutex = connection.getMutex(); out.setPacketType(SYBQUERY_PKT); out.write((byte)TDS5_DYNAMIC_TOKEN); out.write((short) (15)); out.write((byte) 4); out.write((byte) 0); out.write((byte) 10); out.writeAscii(procName.substring(1)); out.write((short)0); out.flush(); endOfResponse = false; clearResponseQueue(); messages.checkErrors(); } catch (IOException ioe) { connection.setClosed(); throw Support.linkException( new SQLException( Messages.get( "error.generic.ioerror", ioe.getMessage()), "08S01"), ioe); } catch (SQLException e) { if ("08S01".equals(e.getSQLState())) { // Serious error rethrow throw e; } // This exception probably caused by failure to unprepare } finally { if (mutex != null) { mutex.release(); } } } /** * Enlist the current connection in a distributed transaction or request the location of the * MSDTC instance controlling the server we are connected to. * * @param type set to 0 to request TM address or 1 to enlist connection * @param oleTranID the 40 OLE transaction ID * @return a <code>byte[]</code> array containing the TM address data * @throws SQLException */ synchronized byte[] enlistConnection(int type, byte[] oleTranID) throws SQLException { Semaphore mutex = null; try { mutex = connection.getMutex(); out.setPacketType(MSDTC_PKT); out.write((short)type); switch (type) { case 0: // Get result set with location of MSTDC out.write((short)0); break; case 1: // Set OLE transaction ID if (oleTranID != null) { out.write((short)oleTranID.length); out.write(oleTranID); } else { // Delist the connection from all transactions. out.write((short)0); } break; } out.flush(); endOfResponse = false; endOfResults = true; } catch (IOException ioe) { connection.setClosed(); throw Support.linkException( new SQLException( Messages.get( "error.generic.ioerror", ioe.getMessage()), "08S01"), ioe); } finally { if (mutex != null) { mutex.release(); } } byte[] tmAddress = null; if (getMoreResults() && getNextRow()) { if (rowData.length == 1) { Object x = rowData[0]; if (x instanceof byte[]) { tmAddress = (byte[])x; } } } clearResponseQueue(); messages.checkErrors(); return tmAddress; } /**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -