2009-10-27 7 views
31

자동 전화 번호를 기본 키로 사용하는 JET 테이블이 있는데 행을 삽입 한 후이 번호를 검색 할 수있는 방법을 알고 싶습니다. MAX()를 사용하여 가장 높은 값을 가진 행을 검색하려고 생각했지만 이것이 얼마나 신뢰할 수 있을지 확신하지 못했습니다. 일부 샘플 코드 :마지막으로 삽입 된 행의 자동 번호 값 - MS Access/VBA

Dim query As String 
Dim newRow As Integer 
query = "INSERT INTO InvoiceNumbers (date) VALUES (" & NOW() & ");" 
newRow = CurrentDb.Execute(query) 

는 지금은 Execute() 기본 키의 값을 반환하지 않습니다 때문에이 작동하지 않을 것이라는 점을 알고있다, 그러나 이것은 기본적으로 내가 찾고 있어요 코드의 일종이다. 다른 테이블의 행 수를 업데이트하려면 새 행의 기본 키를 사용해야합니다.

가장 간단하고/가장 판독하기 쉬운 방법은 무엇입니까?

답변

32

ADO 유효한 ADO 연결되는 CN

cn.Execute "INSERT INTO TheTable.....", , adCmdText + adExecuteNoRecords 
Set rs = cn.Execute("SELECT @@Identity", , adCmdText) 
Debug.Print rs.Fields(0).Value 

를 사용하는 경우 DAO가

RS.Move 0, RS.LastModified 
lngID = RS!AutoNumberFieldName 

를 사용하는 경우, @@Identity 마지막 Identity (일련 번호)가이 연결에 삽입 반환한다.

마지막으로 생성 된 값은 관심있는 하나하지 않을 수 있기 때문에 @@Identity가 골칫거리가 될 수 있음. Access 데이터베이스 엔진의 경우, 당신에게 INSERT INTOIDENTITY 속성이 모두 두 개의 테이블을 조인 VIEW을 고려하고,

VIEW. SQL Server의 경우 IDENTITY 속성을 가진 다른 테이블에 레코드를 차례로 삽입하는 트리거가 있는지 고려하십시오.

BTW DMax는 레코드를 삽입 한 직후부터 Dmax 기능이 끝나기 전에 레코드를 가져 오는 것처럼 작동하지 않습니다.

+14

DAO도 @@ IDENTITY를 선택 할 수 있습니다 - 당신은 ADO를 필요로하지 않습니다. 난 항상 이렇게 : lngID = db.OpenRecordset ("SELECT @@ IDENTITY") (0), 여기서 "db"는 삽입을 실행하는 데 사용 된 동일한 데이터베이스 변수입니다. 더 이상 레코드 세트를 열지 않고 추가합니다. –

41

예를 들어, CurrentDB를 사용하여 INSERT를 실행 했으므로 자신을 더욱 어렵게 만들었습니다. 대신이 작동합니다 : 내가하는 데 사용

Dim query As String 
    Dim newRow As Long ' note change of data type 
    Dim db As DAO.Database 

    query = "INSERT INTO InvoiceNumbers (date) VALUES (" & NOW() & ");" 
    Set db = CurrentDB 
    db.Execute(query) 
    newRow = db.OpenRecordset("SELECT @@IDENTITY")(0) 
    Set db = Nothing 

는 AddOnly 레코드를 열고 거기에서 ID를 선택하여 추가, 그러나 이것은 훨씬 더 효율적입니다. 그리고 토니는 ADO가 필요 없다고 말합니다.

+2

및 레코드 집합이 SQL Server 연결 테이블 인 경우에도 작동합니다! 훌륭한 ! –

+0

또한 dbFailOnError를 옵션으로 실행에 추가 할 수 있습니다. 그렇지 않으면 액세스가 실패하면 아무 것도 말하지 않습니다. ----- db.쿼리 실행, dbFailOnError – JustJohn

+0

@iDevlop SQL Server는 [SELECT @@ IDENTITY 구문] (https://msdn.microsoft.com/en-us/library/ms187342.aspx)을 지원합니다. Excel이나 Oracle이나 MySQL 같은 다른 RDBMS와 같은 다른 연결된 테이블 유형에서 어떤 일이 발생하는지 보는 것은 흥미로울 것입니다. –

3

내 코드에서 발췌 한 내용입니다. 저는 developpez.com에서 영감을 받았습니다 ("INSERT 형식의 레코드 세트와 일치하지 않는 레코드 세트를 사용하십시오."). 그들은 (약간의 프랑스어로) 설명합니다. 이 방법은 하나의 상단보다 훨씬 빠릅니다. 이 예에서이 방법은 37 배 빠릅니다. 시도 해봐.

Const tableName As String = "InvoiceNumbers" 
Const columnIdName As String = "??" 
Const columnDateName As String = "date" 

Dim rsTable As DAO.recordSet 
Dim recordId as long 

Set rsTable = CurrentDb.OpenRecordset(tableName) 
Call rsTable .AddNew 
recordId = CLng(rsTable (columnIdName)) ' Save your Id in a variable 
rsTable (columnDateName) = Now()  ' Store your data 
rsTable .Update 

recordSet.Close 

LeCygne

+3

특정 예제가 "37 배 빠름"을 확인해 주시겠습니까? –

1
Private Function addInsert(Media As String, pagesOut As Integer) As Long 


    Set rst = db.OpenRecordset("tblenccomponent") 
    With rst 
     .AddNew 
     !LeafletCode = LeafletCode 
     !LeafletName = LeafletName 
     !UNCPath = "somePath\" + LeafletCode + ".xml" 
     !Media = Media 
     !CustomerID = cboCustomerID.Column(0) 
     !PagesIn = PagesIn 
     !pagesOut = pagesOut 
     addInsert = CLng(rst!enclosureID) 'ID is passed back to calling routine 
     .Update 
    End With 
    rst.Close 

End Function 
+1

이것이 원래 질문에 어떻게 대답하는지 보지 못합니다. 이 상황이 어떻게 적용되는지 보려면 상황을 추가하십시오. – GPI

+1

이 답변은 확실하지 않습니다. 설명을 추가하십시오. 우리 모두가 vba에 대해 ** 모든 것을 ** 알지 못합니다. – MJH

관련 문제