2011-12-08 35 views
5
Set rsPlanID = Server.CreateObject("ADODB.Recordset") 
rsPlanID.CursorLocation = adUseClient 

strSQL = "SELECT PlanID FROM ATTJournals WHERE ATTUserDataID = " & ATTUserDataID 
rsPlanID.Open strSQL, m_objConn, adOpenStatic, adLockOptimistic 

If Not rsPlanID.EOF Then 
    response.Write "New PlanID:" & rsPlanID("PlanID") 
End If 

Mã trên nằm trong cổ điển.Lỗi ADODB.Recordset '800a0bb9': Đối số sai loại

Tôi nhận được lỗi sau:

ADODB.Recordset error '800a0bb9'
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

dows ai biết nguyên nhân lỗi này và làm thế nào để sửa chữa nó?

Trả lời

14

Các nhất như nguyên nhân là do bạn đã không bao gồm "ADOVBS.INC" hoặc META equavalent: -

<!--METADATA 
TYPE="TypeLib" 
NAME="Microsoft ActiveX Data Objects 2.6 Library" 
UUID="{00000206-0000-0010-8000-00AA006D2EA4}" 
VERSION="2.6" 
--> 

Do đó adxxxx hằng không tồn tại. Tuy nhiên, lỗi chính của bạn không bao gồm Option Explicit ở đầu tập lệnh của bạn. Điều này sẽ giúp bạn tiết kiệm rất nhiều thời gian để tìm ra những sai lầm ngớ ngẩn và lỗi chính tả.

BTW Điều gì sẽ xảy ra nếu ATTUserDataID chứa "0; DELETE ATTJournals;" ?
Tránh soạn SQL bằng cách ghép nối như bệnh dịch hạch. Tìm kiếm "ASP SQL Injection" để tìm các ví dụ về cách sử dụng các đối tượng lệnh được tham số hóa thay thế.

+0

Bạn có thể đặt điều này trong global.asa (ví dụ: một địa điểm, thay vì hàng trăm tệp .asp) không? – NealWalters

+1

@NealWalters Có, trên thực tế tôi rất muốn giới thiệu nó. – Lankymart

0

Trước tiên, khi tôi xóa đơn đăng ký bằng vbscript, tôi luôn sử dụng các số để mở bản ghi. Tôi khuyên bạn nên làm theo dòng sau:

rsPlanID.Open strSQL, m_objConn, 3, 3 

Đảm bảo bạn bao gồm tệp adovbs.inc trước tiên. Các con số được kết nối với các loại thuộc tính recordset khác nhau. Và đừng bỏ qua để mở kết nối dữ liệu trước.

Thứ hai, tôi nghĩ rằng bạn không cần dòng

rsPlanID.CursorLocation = adUseClient 

Thrird, xem thêm this thread. Có lẽ nó là một mẫu tốt cho bạn.

0

Trừ khi bạn cần để di chuyển qua lại trong recordset, chỉ cần sử dụng các thiết lập mặc định:

strSQL = "SELECT PlanID FROM ATTJournals WHERE ATTUserDataID = " & ATTUserDataID 
Set rsPlanID = m_objConn.Execute(strSQL) 

Ngoài ra, mã của bạn đang rộng mở cho các cuộc tấn công SQL Injection - bạn tốt hơn tìm hiểu về nó và thay đổi mã của bạn để sử dụng Tham số thay thế.

-1
Function SQL_getRecordset(strQuery) 

'On Error Resume Next 
'Create Database connection object 
    Set objConnection = CreateObject("ADODB.Connection") 

    'Create Recordset object 
    Set objrecordset = CreateObject("ADODB.Recordset") 

    'Specify the connection string 
    strConnectionstring = "Provider=SQLOLEDB.1;Data Source=*<Server name>*;Initial Catalog=*<database>*;Integrated Security=SSPI" 
    objConnection.Open strConnectionstring 

    'Execute the Query 
    Set objrecordset = objConnection.Execute(strQuery) 

    'Return Recordset 
    Set SQL_getRecordset = objrecordset 

    'Release objects from the memory 
    Set objConnection = Nothing 
    Set objrecordset = Nothing 

End Function 
0

Tôi cảm thấy như tôi đã tìm kiếm toàn bộ internet và không thể tìm ra giải pháp cho vấn đề này, và cũng giống như tôi đã muốn bỏ cuộc, tôi nhận ra rằng tôi đã tuyên bố biến kết nối của tôi trong một "If" tuyên bố và vì câu lệnh if đã không thực thi cũng không lệnh của tôi cho cơ sở dữ liệu đưa ra lỗi như đã đề cập trong câu hỏi của bạn.

Các vấn đề liên quan