2015-01-23 5 views
4

이 코드 조각으로이 오류가 발생하고 이유가 확실하지 않습니다. 내가 읽고 약간 earier 내 코드를 만들기 위해 노력하고 그것이 큰 도움이 될 것많은 매개 변수를 사용하여 저장 프로 시저 호출

Public Function SaveProperty() As Boolean 
'** Save Current Personal Data Record 

' Error Checking 
On Error GoTo Err_SaveProperty 

' Dimension Local Variables 
Dim uRecSnap As ADODB.Recordset 
Dim uPar As ADODB.Parameter 

' Check For Open Connection 
If uDBase Is Nothing Then 
    OpenConnection() 
    bConnection = True 
End If 

' Run Stored Procedure - Save Property Record 
uCommand = New ADODB.Command 
With uCommand 
    .ActiveConnection = uDBase 
    .CommandType = ADODB.CommandTypeEnum.adCmdStoredProc 
    .CommandTimeout = 0 
    .Parameters.Append.CreateParameter("@PropertyID", ADODB.DataTypeEnum.adInteger, ADODB.ParameterDirectionEnum.adParamInput, 50, Val(lblPropertyIDValue.Text)) 
    .Parameters.Append.CreateParameter("@PropertyManager", ADODB.DataTypeEnum.adLongVarChar, ADODB.ParameterDirectionEnum.adParamInput, 60, cmbPropertyManager.Text) 
    .Parameters.Append.CreateParameter("@AddressLine1", ADODB.DataTypeEnum.adLongVarChar, ADODB.ParameterDirectionEnum.adParamInput, 30, txtAddress1.Text) 
    .Parameters.Append.CreateParameter("@AddressLine2", ADODB.DataTypeEnum.adLongVarChar, ADODB.ParameterDirectionEnum.adParamInput, 30, txtAddress2.Text 
'...ETC 

.CommandText = "PropertyMaster_SaveRecord" 

    .Execute() 
End With 

' Close Connection 
uRecSnap = Nothing 
uCommand = Nothing 
If bConnection Then CloseConnection() 
SaveProperty = True 

Err_SaveProperty: 
If Err.Number <> 0 Then 
    sErrDescription = Err.Description 
    WriteAuditLogRecord("clsProperty", "SaveProperty", "Error", sErrDescription) 
    SaveProperty = False 
End If 

나는이

uPar = .CreateParameter("@LandlordID", ADODB.DataTypeEnum.adInteger, ADODB.ParameterDirectionEnum.adParamInput) 
    .Parameters.Append(uPar) 
    .Parameters("@LandlordID").Value = Val(lblLandlordID.Text) 
+1

오류는 무엇입니까? – Chrismas007

+2

나는 [이 댓글] (http://codereview.stackexchange.com/questions/78439/overload-resolution-failed-because-no-accessible-append-accepts-this-number-of-a#comment142091_78439)을 복사/붙여 넣기했습니다.). ".Append'와'.CreateParameter.' 사이에 공백을 추가하십시오. 다른 질문에 대한 답변에서 내가 작성한 내용과 조심스럽게 비교하십시오." – RubberDuck

+0

보고있는 오류가 무엇인가요? – Rose

답변

4

같은 것을에서 아래 코드의 라인을 감소했다

최종 기능 훌륭한 With 성명서에 대한 경고에 오신 것을 환영합니다!

@RubberDuck이 암시로, 문제는 여기에 있습니다 :

.Parameters.Append.CreateParameter(...) 

은 다음과 같아야합니다

uCommand.Parameters.Append uCommand.CreateParameter(...) 

Append 다음 With 블록없이

.Parameters.Append .CreateParameter(...) 

,이있을 것 및 CreateParameter은 모두의 구성원입니다.With 블록이 작업중인 개체. 당신이 정말로 코드를 읽기 쉽게 확인하려면

1

, 그냥 이렇게 :

' Run Stored Procedure - Save Property Record 
Set uCommand = New ADODB.Command 'Note use of Set keyword 
With uCommand 
    .ActiveConnection = uDBase 
    .CommandType = adCmdStoredProc 'Don't need the entire object hierarchy here 
    .CommandTimeout = 0 
    .CommandText = "PropertyMaster_SaveRecord" 
    .Parameters.Refresh 
    .Parameters(1) = cmbPropertyManager.Text 'Collections are usually 1-based in VB6 
    .Parameters(2) = txtAddress1.Text 
    .Parameters(3) = txtAddress2.Text 
    '...ETC 
    .Execute() 
End With 

이 매개 변수를 찾기 위해 추가로 왕복을 필요로 않습니다. 그러나 성능 오버 헤드를 감수 할 수 있다면이 방법이 더 쉽습니다. 또한 저장 프로 시저의 매개 변수 목록과 밀접하게 결합되어 있지 않기 때문에 잠재적 인 유지 관리 오버 헤드가 줄어 듭니다. 예를 들어 저장된 프로 시저에서 매개 변수의 이름을 바꿀 수 있습니다.

열거 형의 전체 개체 계층 구조를 사용할 때 맞춤법을 지정할 필요가 없습니다. 사실 나는 전에 그것을 한 번도 본 적이 없다. 그렇게하지 않으면 코드를 읽기 쉽게 만듭니다.

그런 다음 새 개체를 인스턴스화 할 때 Set 키워드를 사용하십시오.

마지막으로

이 대체 :이

If uDBase Is Nothing Then 
    OpenConnection() 
    bConnection = True 
End If 

을 :

If uDBase.State = adStateClosed Then 
    OpenConnection() 
    bConnection = True '?? Probably don't need this, see below 
End If 
객체가 아무것도 없습니다 여부 검사에 의존하지 않으려는 이유는 당신이 연결을 종료 할 수 있다는 것입니다

어딘가 다른 코드에서 uDBase를 아무 것도 설정하지 마십시오. 이것은 찾기 힘든 버그를 만들 수 있습니다. 또한 연결이 열려 있는지 여부를 추적하기 위해이 변수를 사용하고 있기 때문에 bConnection 변수가있는 유일한 이유는 안전하게 제거하고 State 속성을 사용할 수 있다는 것입니다.

OpenConnection 루틴을 GetConnection 루틴으로 변경하고 열린 연결에 대한 모든 검사를 캡슐화하는 등의 개선이 필요합니다.예 :

Public Function GetConnection() As ADODB.Connection 
    Static myConn As ADODB.Connection 
    If myConn.State = adStateClosed Then 
     Set myConn = New ADODB.Connection 
     myConn.Open "myConnectionString" 
    End If 
    GetConnection = myConn 
End Function 

이 내용은 응용 프로그램 전체에서 하나의 연결로 작업 중이며 응용 프로그램이 실행 중일 때 열려 있다고 가정합니다. 이것은 uDBase 변수의 범위에 의해 암시됩니다. 연결을 관리하는 데 경제적 인 방법이 있습니다. 물론 처리량에 따라보아야 할 수도 있습니다.

관련 문제