2012-06-12 2 views
0

저장 프로 시저 [MySp]가 있습니다.@Table 변수를 사용하면 응용 프로그램에서 Adodb 문제가 발생하는 이유는 무엇입니까?

그래서 나는이 프로그램을 실행할 때 작동 ..이 체크 아웃 : 나는이 작업을 수행 할 때, 내가 응용 프로그램 측에서 오류가 발생,

SELECT ID,Name FROM Table 

을하지만 (ADODB)

Declare @Table TABLE(ID int,Name varchar(10)) 

--- Inserts into table variable --- 
INSERT INTO @Table 
SELECT ID,Name FROM Table 

--- Returns data from table variable --- 
SELECT ID,Name FROM @Table 

보관할 것 마음에, SQL 콘솔에서 [MySp]에 대한 동일한 결과를 얻을 수 있지만 응용 프로그램/adodb 코드에서 오류가 발생합니다.

ASP 코드 : 내가 SQL에서 테이블 변수를 사용할 때이 오류를 받고 있어요 왜

Set oRS = Server.CreateObject("Adodb.Recordset") 
oRS.Open "[MySp]", Conn 
If oRS.EOF Then... <--Gives an error 

ADODB.Recordset error '800a0e78' 
Operation is not allowed when the object is closed. 

사람이 알고 있나요?

답변

7

SET NOCOUNT ON을 저장 프로 시저 상단에 추가하십시오.

ADO가 삽입/업데이트/삭제에서 돌아 오는 결과 카운트에 혼란 스러웠다는 모호한 기억이 있습니다.

예컨대 :

CREATE PROCEDURE MySP 
AS 

SET NOCOUNT ON 

Declare @Table TABLE(ID int,Name varchar(10)) 

--- Inserts into table variable --- 
INSERT INTO @Table 
SELECT ID,Name FROM Table 

--- Returns data from table variable --- 
SELECT ID,Name FROM @Table 
+0

감사합니다. 나는 완전히 그것을 놓쳤다, 나는 보통 나의 sp에이 선을 포함시킨다. –

0

은 내가 저장된 프로 시저를 포함하지 약간 더 복잡한 (비슷하지만) 문제를 가지고 있었다.

생각 누가 비슷한 위치에있는 사람을 찾았을 경우에 대비해 생각했습니다.

문제

SQL :

DECLARE @a (
Alpha VARCHAR(10), 
Beta INT 
); 
INSERT @a VALUES 
('A', 1) 

DECLARE @b (
Gamma DATE, 
Delta INT 
); 
INSERT @b VALUES 
('2014-01-01', 1) 

SELECT * 
FROM @a a 
JOIN @b b ON a.Beta = b.Delta 

VBA :

Sub GetData() 
    Dim sSql 
    Dim oConnection As New ADODB.Connection 
    Dim oRecordSet As New ADODB.Recordset 

    Call oRecordSet.Open(sSqlQuery, oConnection, adOpenStatic, adLockReadOnly) 
    Call oConnection.Open("Provider=SQLOLEDB.1;Server=MyServer;Database=MyDB;Trusted_Connection=Yes;") 

    sSql = <as Above> 

    Call oRecordSet.Open(sSql, oConnection, adOpenStatic, adLockReadOnly) 

    If oRecordSet.RecordCount > 0 Then 
     ' DO STUFF WITH DATA 
    End If 

    ' Close objects 
    oConnection.Close 
    oRecordSet.Close 
End Sub 

솔루션

SQL_1

CREATE TABLE #a (
Alpha VARCHAR(10), 
Beta INT 
); 
INSERT #a VALUES 
('A', 1) 

SQL_2

CREATE TABLE #b (
Gamma DATE, 
Delta INT 
); 
INSERT #b VALUES 
('2014-01-01', 1) 

SQL_3

SELECT * 
FROM #a a 
JOIN #b b ON a.Beta = b.Delta 

SQL_4

DROP TABLE #a; 

SQL_5

DROP TABLE #b; 

VBA

Sub GetData() 
    Dim sSql 
    Dim oConnection As New ADODB.Connection 
    Dim oRecordSet As New ADODB.Recordset 

    Call oConnection.Open("Provider=SQLOLEDB.1;Server=MyServer;Database=MyDB;Trusted_Connection=Yes;") 

    sSql = <SQL_1> 
    Call oConnection.Execute(sSql) 

    sSql = <SQL_2> 
    Call oConnection.Execute(sSql) 

    sSql = <SQL_3> 
    Call oRecordSet.Open(sSql, oConnection, adOpenStatic, adLockReadOnly) 
    If oRecordSet.RecordCount > 0 Then 
     ' DO STUFF WITH DATA 
    End If 

    sSql = <SQL_4> 
    Call oConnection.Execute(sSql) 

    sSql = <SQL_5> 
    Call oConnection.Execute(sSql) 

    oConnection.Close 
    oRecordSet.Close 
End Sub 

설명

기본적으로 필자는 VBA가 초기 INSERT 후에 결과를 얻으려고하므로 개별 명령 (실행)으로 분리하고 원하는 데이터를 쿼리 할 때만 레코드 집합을 여는 것이 트릭을 수행하는 것으로 보입니다.

이것의 측면 문제는 임시 테이블을 사용해야한다는 것입니다. 임시 테이블을 사용하는 것이 좋습니다. 임시 테이블을 사용하는 것은 가변 테이블을 믿는 것처럼 라이브 DB이며 이전에는 사용하지 않았기 때문에 수행 할 수있는 권한이 있다는 것을 실제로 깨닫지 못했습니다. 두 번째 전화를 할 때쯤에 사라 졌을 것입니다. 당신은 내가 별도의 함수를 호출 각 명령이 있고 연결마다 폐쇄/개방 된 초기 (모든 일을 한 후에는 연결을 종료 확인

다른 일들이

  • 알고 있어야합니다
  • 당신이 마지막에

희망을 임시 테이블을 삭제해야합니다) 그것에 대해 생각하지 않고 다른 사람을 도움 !

관련 문제