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 

Keep в SQL Console я получаю те же результаты для [MySp], но в коде приложения/adodb я получаю ошибки.

ASP код:

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. 

Кто-нибудь знает, почему я получаю эту ошибку, когда я использую таблицы переменных в SQL?

ответ

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, поэтому его разделение на отдельные команды (Executes) и открытие только набора записей, когда мы запрашиваем нужные нам данные, похоже, делает трюк.

Суть этого в том, что мне нужно было использовать временные таблицы (которые я фактически не понимал, что у меня есть разрешения, так как это живая БД, и я никогда не использовал их раньше), поскольку я считаю переменные таблицы исчез бы к тому времени, когда я сделал второй звонок.

Другие вещи, чтобы быть в курсе

  • Убедитесь, что вы только закрыть соединение после того, как вы сделали все (изначально я имел каждую команду, вызываемую из отдельных функций и открытия/закрытия соединения каждый раз, когда не думая об этом)
  • Убедитесь, что вы удалите временные таблицы в конце

Надеются, что это помогает кто-то еще !

Смежные вопросы