#java #sql-server #database #jdbc #database-connection
#java #sql-сервер #База данных #jdbc #подключение к базе данных
Вопрос:
У меня есть этот фрагмент кода, который хорошо работает в DB2 и Oracle, но не работает в MSSQL (как 2005, так и 2008).
c = SessionMgr.getInstance().getTOPLinkManager().getDataSource().getConnection();
String sql = "";
sql = "{CALL " TOPLinkManager.getSchemaPrefix() "CONTACT_REFERENCES (?, ?, ?)}";
cs = c.prepareCall(sql);
cs.setInt(1, dateType);
cs.setDate(2, date);
cs.setInt(3, operator);
cs.execute();
cs.close();
sql= "SELECT FIRST_NAME,LAST_NAME,CREATED,LASTMODIFIED FROM CONTACT WHERE EXISTS(SELECT * FROM CONTACT_REF WHERE CONTACT.SEQID = CONTACT_REF.SEQID AND CONTACT.SITEID = CONTACT_REF.SITEID)";
ps = c.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
Вызванная хранимая процедура заполняет таблицу CONTACT_REF
, которая используется в запросе для получения данных с сервера.
Генерируемое исключение является:
com.microsoft.sqlserver.jdbc.SQLServerException: The server failed to resume the transaction. Desc:3c00000002.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:196)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1454)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:388)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:338)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4026)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1416)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:185)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:160)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:281)
at weblogic.jdbc.wrapper.PreparedStatement.executeQuery(PreparedStatement.java:100)
at marketsoft.tools.purge.actions.PurgeContactAction.checkReferences(PurgeContactAction.java:126)
Это вызываемая хранимая процедура:
IF OBJECT_ID ('CONTACT_REFERENCES', 'P') IS NOT NULL
DROP PROCEDURE CONTACT_REFERENCES
go
CREATE PROCEDURE CONTACT_REFERENCES
@datetype int,
@created DATETIME,
@operator int
AS
BEGIN
BEGIN TRANSACTION
CREATE TABLE #DUP_REF
(
SEQID NUMERIC(19,0),
SITEID NUMERIC(10,0)
)
DELETE FROM PURGE_CONTACT;
DELETE FROM CONTACT_REF;
IF @datetype = 0 BEGIN
IF @operator = 0 BEGIN
insert into PURGE_CONTACT SELECT SEQID,SITEID,DETAILID,DETAILSITE from CONTACT WHERE CREATED < @created;
END
ELSE IF @operator = 1 BEGIN
insert into PURGE_CONTACT SELECT SEQID,SITEID,DETAILID,DETAILSITE from CONTACT WHERE DATEPART(yy,CREATED) = DATEPART(yy,@created)
AND DATEPART(mm,CREATED) = DATEPART(mm,@created)
AND DATEPART(dd,CREATED) = DATEPART(dd,@created);
END
ELSE IF @operator = 2 BEGIN
insert into PURGE_CONTACT SELECT SEQID,SITEID,DETAILID,DETAILSITE from CONTACT WHERE CREATED > @created;
END
END
ELSE IF @datetype = 1 BEGIN
IF @operator = 0 BEGIN
insert into PURGE_CONTACT SELECT SEQID,SITEID,DETAILID,DETAILSITE from CONTACT WHERE LASTMODIFIED < @created;
END
ELSE IF @operator = 1 BEGIN
insert into PURGE_CONTACT SELECT SEQID,SITEID,DETAILID,DETAILSITE from CONTACT WHERE DATEPART(yy,LASTMODIFIED) = DATEPART(yy,@created)
AND DATEPART(mm,LASTMODIFIED) = DATEPART(mm,@created)
AND DATEPART(dd,LASTMODIFIED) = DATEPART(dd,@created);
END
ELSE IF @operator = 2 BEGIN
insert into PURGE_CONTACT SELECT SEQID,SITEID,DETAILID,DETAILSITE from CONTACT WHERE LASTMODIFIED > @created;
END
END
INSERT INTO #DUP_REF SELECT SEQID,SITEID
FROM PURGE_CONTACT
WHERE EXISTS (SELECT *
FROM LEAD
WHERE LEAD.CONTACTID = PURGE_CONTACT.SEQID
AND LEAD.CONTACTSITE = PURGE_CONTACT.SITEID);
INSERT INTO #DUP_REF SELECT SEQID,SITEID
FROM PURGE_CONTACT
WHERE EXISTS (SELECT *
FROM MAPRESULT
WHERE MAPRESULT.CONTACTSEQ = PURGE_CONTACT.SEQID
AND MAPRESULT.CONTACTSITE = PURGE_CONTACT.SITEID);
INSERT INTO #DUP_REF SELECT SEQID,SITEID
FROM PURGE_CONTACT
WHERE EXISTS (SELECT *
FROM USERS
WHERE USERS.CONTACTID = PURGE_CONTACT.SEQID
AND USERS.CONTACTSITE = PURGE_CONTACT.SITEID);
INSERT INTO #DUP_REF SELECT SEQID,SITEID
FROM PURGE_CONTACT
WHERE EXISTS (SELECT *
FROM PLAYER
WHERE PLAYER.CONTACTID = PURGE_CONTACT.SEQID
AND PLAYER.CONTACTSITE = PURGE_CONTACT.SITEID);
INSERT INTO #DUP_REF SELECT SEQID,SITEID
FROM PURGE_CONTACT
WHERE EXISTS (SELECT *
FROM SHOPPINGCART
WHERE SHOPPINGCART.CONTACT_SEQID = PURGE_CONTACT.SEQID
AND SHOPPINGCART.CONTACT_SITEID = PURGE_CONTACT.SITEID);
INSERT INTO CONTACT_REF SELECT DISTINCT SEQID,SITEID FROM #DUP_REF;
DROP TABLE #DUP_REF;
DELETE FROM PURGE_CONTACT
WHERE EXISTS (SELECT *
FROM CONTACT_REF
WHERE CONTACT_REF.SEQID = PURGE_CONTACT.SEQID
AND CONTACT_REF.SITEID = PURGE_CONTACT.SITEID);
COMMIT
END
go
Комментарии:
1.Вы можете прочитать это: social.msdn.microsoft.com/Forums/en-US/sqldataaccess/thread/… amp; sql-server-performance.com/forum/threads/…
2. спасибо за сообщения, Алекс, но я уже на sqljdbc.jar версия 1.2. Кроме того, код для выполнения хранимой процедуры работает нормально, без ошибок. это просто запрос select, который я выполнил после этого, который вызывает ошибки
3. у вас есть какие-либо другие предложения?
4. Вы пытались снова установить соединение (перед выполнением запроса)?
5. Вы пытались комментировать код с помощью вызова хранимой процедуры?