2017-09-20 11 views
0

Access 2010에서 ODBC를 통해 MySQL 서버에 연결된 응용 프로그램을 개발했습니다. 열VBA ADODB 거래

ID, FirstName, LastName, TelNo, MobileNo, EmailAddress, PrimaryContact, TimeStamp 

ReportingType :

나는 2 개 테이블 열

ContactDetails

ID, ReportType, ContactID, TimeStamp 

가 나는 ADO 트랜잭션을 사용하고 있습니다를하지만 ContactDetails에 삽입 할 때, 나는 필요 ID를 검색하여 ReportingType에 해당 레코드를 삽입하고을 설정할 수 있습니다.은 ContactDetails.ID입니다.

VB.Net에서 SQL 문 끝에 "Select LAST_INSERT_ID()"를 사용할 수 있다는 것을 알고 ExecuteScalar은 자동으로 증가 된 ID을 반환합니다.

다음은

Dim conn As ADODB.Connection 

On Error GoTo ErrorHandler 
Set conn = CurrentProject.Connection 

With conn 

    .BeginTrans 

    'insert a new customer record 
    .Execute "INSERT INTO ContactDetails (" & _ 
      "FirstName, " & _ 
      "LastName , " & _ 
      "TelNo , " & _ 
      "MobileNo ," & _ 
      "EmailAddress ," & _ 
      "IsPrimaryContact) " & _ 
      "Values (" & _ 
      "'" & Me.FirstName & "'," & _ 
      "'" & Me.LastName & "'," & _ 
      "'" & Me.TeleNum & "'," & _ 
      "'" & Me.MobileNum & "'," & _ 
      "'" & Me.EmailAddress & "'," & _ 
      False & ");", , adCmdText + adExecuteNoRecords 

      'Added from a possible solution 
      Dim rs As New ADODB.Recordset 
      Set rs = conn.Execute("SELECT @@Identity", , adCmdText) 
      Debug.Print rs.Fields(0).Value ' This returned 0 

     'Inset a new record into the ReportingType Table 
     For i = 1 To ListView1.ListItems.Count 
      If ListView1.ListItems(i).Checked Then 
       .Execute "INSERT INTO ReportingType " & _ 
          "(ReportType, ContactID) " & _ 
          "VALUES " & _ 
          "('" & colReportType(ListView1.ListItems(i)) & "' , " & ContactID & ")" 
      End If 

     Next i 

    .CommitTrans 
End With 
ExitHere: 
    Set conn = Nothing 
    Exit Sub 
ErrorHandler: 
    If Err.Number = -2147467259 Then 
     MsgBox Err.Description 
     Resume ExitHere 
    Else 
     MsgBox Err.Description 
     With conn 
      .RollbackTrans 
      '.Close 
     End With 
     Resume ExitHere 
    End If 
End Sub 

당신이 나를 도울 수 제발 내 코드?

+1

당신은 당신이 (AN'ADODB.RecordSet'을 통해) 최신 ID 값을 반환 할 데이터를 기록 후'연락 Details'를 조회하고 옆'INSERT INTO' 문 –

+0

가능한 복제를 사용할 수 있습니다 [마지막으로 삽입 된 행의 자동 번호 값 - MS Access/VBA] (https://stackoverflow.com/questions/1628267/autonumber-value-of-last-inserted-row-ms-access-vba) –

+0

https : // stackoverflow.com/questions/42648/best-way-to-get-identity-of-inserted-row – braX

답변

0

모든 의견에 감사드립니다. 문제가 계속 발생했지만이 솔루션은 상당히 잘 작동합니다. 나는 다음 저장 프로 시저를 호출

CREATE PROCEDURE `SPAddPartnerContact`(IN `PartnerID` INT(8), IN `FirstName` VARCHAR(255), IN `LastName` VARCHAR(255), IN `TelNo` VARCHAR(10), IN `MobileNo` VARCHAR(10), IN `EmailAddress` TEXT, IN `IsPrimaryContact` TINYINT(2), IN `_list` TEXT) 
BEGIN 
DECLARE _next TEXT DEFAULT NULL; 
DECLARE _nextlen INT DEFAULT NULL; 
DECLARE _value TEXT DEFAULT NULL; 
DECLARE _ContactID INT DEFAULT 0; 

DECLARE exit handler for sqlexception 
    BEGIN 
    -- ERROR 
    ROLLBACK; 
END; 

DECLARE exit handler for sqlwarning 
BEGIN 
    -- WARNING 
ROLLBACK; 
END; 

START TRANSACTION; 

INSERT INTO 
ContactDetails 
(BP_ID, FirstName, 
LastName, TelNo , 
MobileNo, 
EmailAddress, 
IsPrimaryContact) 
Values 
(PartnerID, 
FirstName, 
LastName, 
TelNo, 
MobileNo, 
EmailAddress, 
IsPrimaryContact); 

SET _ContactID = LAST_INSERT_ID(); 


iterator: 
LOOP 
    IF LENGTH(TRIM(_list)) = 0 OR _list IS NULL THEN 
    LEAVE iterator; 
    END IF; 

    SET _next = SUBSTRING_INDEX(_list,',',1); 
    SET _nextlen = LENGTH(_next); 
    SET _value = TRIM(_next); 

    INSERT INTO ReportingType (ReportType, BP_ID, ContactID) VALUES (_next, PartnerID, _ContactID); 
    SET _list = INSERT(_list,1,_nextlen + 1,''); 
END LOOP; 

COMMIT; 



END 

:

나는 MySQL의 저장 프로 시저 생성

Private Sub AddPartnerContact() 
Dim ContactID As Long 

Dim cmdSQL As ADODB.Command 
Dim rsAddContact As New ADODB.Recordset 

Dim bRecordAdded As Boolean 
Dim sList As String 
Dim delimiter As String 

delimiter = ", " 

On Error GoTo ErrorHandler 


    Set cmdSQL = New ADODB.Command 

    With cmdSQL 
     .ActiveConnection = Replace(DBEngine.Workspaces(0).Databases(0).TableDefs("ContactDetails").connect, "ODBC;", "") 
     .CommandType = adCmdStoredProc 
     .CommandText = "SPAddPartnerContact" 
     .Parameters.Append .CreateParameter("PartnerID", adInteger, adParamInput, 8, PartnerID) 
     .Parameters.Append .CreateParameter("FirstName", adVarChar, adParamInput, 255, Me.FirstName) 
     .Parameters.Append .CreateParameter("LastName", adVarChar, adParamInput, 255, Me.LastName) 
     .Parameters.Append .CreateParameter("TelNo", adVarChar, adParamInput, 50, Me.TeleNum) 
     .Parameters.Append .CreateParameter("MobileNo", adVarChar, adParamInput, 50, Me.MobileNum) 
     .Parameters.Append .CreateParameter("EmailAddress", adVarChar, adParamInput, 255, Me.EmailAddress) 
     .Parameters.Append .CreateParameter("IsPrimaryContact", adTinyInt, adParamInput, 50, Me.PrimaryContact) 

      For i = 1 To ListView1.ListItems.Count 
       If ListView1.ListItems(i).Checked Then 
        sList = sList & colReportType(ListView1.ListItems(i)) & delimiter 
       End If 
      Next i 

      sList = Left(sList, Len(sList) - Len(delimiter)) 

      .Parameters.Append .CreateParameter("_list", adVarChar, adParamInput, 255, sList) 


     .Execute 
    End With 


     '.Close 

ExitHere: 
    Set conn = Nothing 

    If bRecordAdded Then 
     MsgBox "Contact Added Successfully", vbOKOnly, "Contact Maintenance" 
     Call cmdClose_Click 
    End If 


    Exit Sub 
ErrorHandler: 
    bRecordAdded = False 
    If Err.Number = -2147467259 Then 
     MsgBox Err.Description 
     Resume ExitHere 
    Else 
     MsgBox Err.Description 

     Resume ExitHere 
    End If 
End Sub 

이 정리의 조금을 할 필요를하지만 난 내가 필요한 결과를 얻었다.

다시 시간을내어 원래의 질문에 답변 해 주셔서 감사합니다.

대런