반환된 레코드 집합이 닫혔습니다(VBA의 ODBC를 통해 mysql DB에 액세스됨).
오랜만에 보는 사람 첫 포스터.저는 엑셀에서 프런트 엔드로 데이터베이스 애플리케이션을 작업하고 있습니다.따라서 VBA를 사용하여 MySQL 데이터베이스에 액세스하고 있습니다.제가 사용하는 드라이버는 ODBC 드라이버(Windows)이며, 다른 많은 쿼리가 제대로 작동하므로 데이터베이스에 대한 유효한 연결이 있습니다.
제가 하려는 것은 일련의 SQL 문에서 얻은 결과를 하나의 거대한 문으로 결합하는 것이 아니라 결과를 반환하는 것입니다(아마도 효과적이지만 유지/이해하기가 어려울 것입니다).깃발을 추가했습니다.FLAG_MULTI_STATEMENTS = 67108864
드라이버 구문 오류를 억제하는 연결 문자열입니다.
하지만 이제 다음을 실행합니다.
queryDB.Open SQLquery, conn
그recordset (queryDB)
명백한 오류 없이 닫힌 상태로 유지됩니다.sql 문은 여기에서 찾을 수 있습니다.
VBA에 반환되지 않는 오류가 발생할 수 있으므로 도움을 주시면 감사하겠습니다.
참고: sql 문은 다음에 해당 문을 붙여넣을 수 있으므로 작동합니다.phpMyAdmin
올바른 결과(공백이 아닌)를 반환합니다.구체적으로 진술이 문제인지는 모르겠지만 아마도 사용할 것입니다.CREATE TEMPORARY TABLE ...
또는 일반적으로 다중 진술의 사용.
또한 드라이버가 각 sql 문에 대한 결과를 반환하려고 할 수 있으며 VBA는 첫 번째 또는 다른 것을 얻는 중입니다.
EDIT: 나중에 참조할 SQL 문입니다.
CREATE TEMPORARY TABLE tmpOrders AS
SELECT
o.customerName,
SUM(o.Sales) AS Sales,
SUM(TotalFobCost + TotalLandedCost + TotalLocalCost + TotalCmtCost) AS TotalCost,
YEAR(o.deliveryDate) AS YEAR,
MONTH(o.deliveryDate) AS MONTH
FROM devere_costing.orders_fixed_extras AS o
WHERE o.orderApproved = TRUE
AND o.orderCanceled = FALSE
AND o.deliveryDate BETWEEN '2014-01-01' AND '2014-03-31'
GROUP BY customerName, YEAR, MONTH
ORDER BY YEAR ASC, MONTH ASC, customerName ASC;
CREATE TEMPORARY TABLE tmpProj AS
SELECT p.customerName,
IF(p.MONTH > 9, p.YEAR, p.YEAR - 1) AS TrueYear,
1 + ((p.MONTH + 2) MOD 12) AS TrueMonth,
SUM(p.actualSalesInvoiced) AS salesInvoiced,
SUM(p.budget) AS budget
FROM devere_costing.sales_projection_data AS p
GROUP BY p.customerName, p.YEAR, p.MONTH
HAVING TrueYear BETWEEN YEAR('2014-01-01') AND YEAR('2014-03-31')
AND TrueMonth BETWEEN MONTH('2014-01-01') AND MONTH('2014-03-31');
CREATE TEMPORARY TABLE tmpLeft AS
SELECT
IF(o.customerName IS NULL, p.customerName, o.customerName) AS customerName,
p.budget AS TotalBudget,
o.Sales AS Sales,
p.salesInvoiced,
0 AS varianceToBudget,
o.TotalCost,
0 AS directMargin,
0 AS directMarginPercent,
IF(o.YEAR IS NULL, p.TrueYear, o.YEAR) AS YEAR,
IF(o.MONTH IS NULL, p.TrueMonth, o.MONTH) AS MONTH
FROM tmpOrders AS o
LEFT JOIN tmpProj AS p
ON (o.customerName = p.customerName
AND o.YEAR = p.TrueYear
AND o.MONTH = p.TrueMonth);
CREATE TEMPORARY TABLE tmpRight AS
SELECT
IF(o.customerName IS NULL, p.customerName, o.customerName) AS customerName,
p.budget AS TotalBudget,
o.Sales AS Sales,
p.salesInvoiced,
0 AS varianceToBudget,
o.TotalCost,
0 AS directMargin,
0 AS directMarginPercent,
IF(o.YEAR IS NULL, p.TrueYear, o.YEAR) AS YEAR,
IF(o.MONTH IS NULL, p.TrueMonth, o.MONTH) AS MONTH
FROM tmpOrders AS o
RIGHT JOIN tmpProj AS p
ON (o.customerName = p.customerName
AND o.YEAR = p.TrueYear
AND o.MONTH = p.TrueMonth);
(SELECT * FROM tmpLeft) UNION DISTINCT (SELECT * FROM tmpRight);
나는 내 질문에 대답했습니다!
비밀은 여기에 있습니다.
그래서 두 개 이상의 레코드 세트가 반환되었다는 점에서 제가 옳았습니다.저는 제가 원하는 데이터를 찾기 위해 그것들을 반복해야 했습니다.컬렉션이 색인화되어 있지 않기 때문에 각 컬렉션을 검색해야 합니다.내 경우 모든 sql 문이 레코드 집합을 반환하지 않습니다(이것이 내가 레코드 집합을 열려고 할 때 내 레코드 집합이 닫힌 상태를 유지한 이유입니다).유일한 예외는 레코드를 반환하는 마지막 sql 문입니다.내 루프는 다음과 같습니다.
Dim rs As ADODB.Recordset
Set rs = queryDB(Sql)
' Loop through returned recordsets to find the data
Do
If Not rs Is Nothing Then
If rs.State = adStateOpen Then
' we have an open recordset. This means that the final select statement
' has returned this data.
Exit Do
Else
' Otherwise iterate through to the next recordset
Set rs = rs.NextRecordset
End If
Else
MsgBox "No recordset returned by sql statement"
GoTo ExitCode
End If
Loop
질문 본문에서 복사한 답변:
나는 내 질문에 대답했습니다!
비밀은 여기에 있습니다.
그래서 두 개 이상의 레코드 세트가 반환되었다는 점에서 제가 옳았습니다.저는 제가 원하는 데이터를 찾기 위해 그것들을 반복해야 했습니다.컬렉션이 색인화되어 있지 않기 때문에 각 컬렉션을 검색해야 합니다.내 경우 모든 sql 문이 레코드 집합을 반환하지 않습니다(이것이 내가 레코드 집합을 열려고 할 때 내 레코드 집합이 닫힌 상태를 유지한 이유입니다).유일한 예외는 레코드를 반환하는 마지막 sql 문입니다.내 루프는 다음과 같습니다.
Dim rs As ADODB.Recordset
Set rs = queryDB(Sql)
' Loop through returned recordsets to find the data
Do
If Not rs Is Nothing Then
If rs.State = adStateOpen Then
' we have an open recordset. This means that the final select statement
' has returned this data.
Exit Do
Else
' Otherwise iterate through to the next recordset
Set rs = rs.NextRecordset
End If
Else
MsgBox "No recordset returned by sql statement"
GoTo ExitCode
End If
Loop
언급URL : https://stackoverflow.com/questions/16115643/returned-recordset-is-closed-mysql-db-accessed-via-odbc-in-vba
'code' 카테고리의 다른 글
Next3 - 미들웨어에서 Vuex 스토어에 액세스하시겠습니까? (0) | 2023.07.07 |
---|---|
들어오는 커밋을 보려면 어떻게 해야 합니까? (0) | 2023.07.07 |
Mongoose 기반 앱 아키텍처 (0) | 2023.07.07 |
빌드 환경에서 Google 서비스 파일의 Google_APP_ID를 가져올 수 없습니다. (0) | 2023.07.07 |
ASP의 이름을 바꿉니다.NET_세션이드 (0) | 2023.07.07 |