2014-04-21 2 views
2

레코드 중 하나에서 매개 변수로 레코드 집합을 사용하는 VB6 응용 프로그램이 있습니다. .NET 프로젝트에서 ADODB를 사용하여 레코드 세트를 만들고 VB6 프로젝트에 전달합니다. 나는 데이터베이스에 연결 한 후 분리하여 VS2010에서 레코드를 생성 할 때, 모두가 잘 그러나수동으로 만든 레코드 집합이 연결이 끊긴 레코드 집합처럼 작동하지 않습니다.

con.ConnectionString = "Provider=SQLOLEDB.1;Data Source=MyDB;Initial Catalog=IC;User  ID=user;Password=pass" 
rs.ActiveConnection = con 
rs.Open("SELECT * FROM Table1") 
rs.ActiveConnection = Nothing 

, 나는 그물의 DataTable에서 데이터를 복사하여 레코드를 만들 때 : rsRecordSet = 새 ADODB를. 레코드

For Each dtDataColumn As DataColumn In dtDataTable.Columns 
    Select Case dtDataColumn.DataType.UnderlyingSystemType.ToString 
     Case "System.Boolean" : dteRecordSetDataType = DataTypeEnum.adBoolean 
     Case "System.Byte" : dteRecordSetDataType = DataTypeEnum.adUnsignedTinyInt 
     Case "System.Char" : dteRecordSetDataType = DataTypeEnum.adChar 
     Case "System.DateTime" : dteRecordSetDataType = DataTypeEnum.adDate 
     Case "System.Double" : dteRecordSetDataType = DataTypeEnum.adDouble 
     Case "System.Int16" : dteRecordSetDataType = DataTypeEnum.adSmallInt 
     Case "System.Int32" : dteRecordSetDataType = DataTypeEnum.adInteger 
     Case "System.Int64" : dteRecordSetDataType = DataTypeEnum.adBigInt 
     Case "System.SByte" : dteRecordSetDataType = DataTypeEnum.adTinyInt 
     Case "System.Single" : dteRecordSetDataType = DataTypeEnum.adSingle 
     Case "System.UInt16" : dteRecordSetDataType = DataTypeEnum.adUnsignedSmallInt 
     Case "System.UInt32" : dteRecordSetDataType = DataTypeEnum.adUnsignedInt 
     Case "System.UInt64" : dteRecordSetDataType = DataTypeEnum.adUnsignedBigInt 
     Case "System.Guid" : dteRecordSetDataType = DataTypeEnum.adGUID 
     Case "System.String" : dteRecordSetDataType = DataTypeEnum.adVarChar 
     Case Else : dteRecordSetDataType = DataTypeEnum.adVarChar 
    End Select 
    If dtDataColumn.AllowDBNull Then 
     faeRecordSetAttribute = FieldAttributeEnum.adFldIsNullable 
    Else 
     faeRecordSetAttribute = FieldAttributeEnum.adFldUnspecified 
    End If 
    rsRecordSet.Fields.Append(dtDataColumn.ColumnName, dteRecordSetDataType, dtDataColumn.MaxLength, faeRecordSetAttribute) 
Next 

rsRecordSet.CursorLocation = CursorLocationEnum.adUseClient 
rsRecordSet.CursorType = CursorTypeEnum.adOpenDynamic 
rsRecordSet.LockType = LockTypeEnum.adLockOptimistic 
rsRecordSet.ActiveConnection = Nothing 
rsRecordSet.Open() 

For Each dtDataRow As DataRow In dtDataTable.Rows 
    rsRecordSet.AddNew() 
    For Each rsField As ADODB.Field In rsRecordSet.Fields 
     Select Case rsField.Type 
       Case DataTypeEnum.adBoolean : rsField.Value = Convert.ToBoolean(dtDataRow.Item(rsField.Name)) 
       Case DataTypeEnum.adGUID : rsField.Value = "{" & dtDataRow.Item(rsField.Name).ToString & "}" 
       Case Else : rsField.Value = dtDataRow.Item(rsField.Name) 
     End Select 
    Next 
Next 

Return rsRecordSet 

... 내 VB6 프로젝트는 바로 이러한 "작업이 컨텍스트에서 허용되지 않습니다"와 "호출 수신자 (서버 [없는 서버 응용 프로그램]) 사용할 수 없습니다 사라과 같은 오류가 그것을 거부, 모든 연결이 유효하지 않습니다. (HRESULT 예외 : 0x80010007 (RPC_E_SERVER_DIED)) "호출이 실행되었을 수 있습니다. VB6 프로젝트에서 레코드 세트가 거부되고있는 곳을보기 위해 불가능한 시간을 두 번에 걸쳐 디버깅하는 데 어려움을 겪고 있지만 VB6 함수로 넘어 가기 전에 상황이 발생했다고 생각합니다.

다른 사람이 두 레코드의 차이점을 설명 할 수 있기를 바랍니다. 한 번에 데이터베이스 소스에 연결되었음을 나타내는 정보가 하나의 레코드 세트에 있습니까? 내 기존 데이터 테이블에서 "선택"할 수있는 방법이있어서 레코드 세트가 어딘가에서 가져온 것이라고 생각할 수 있습니까?

미리 감사드립니다.

답변

4

.Net은 기본적으로 연결이 끊긴 레코드 집합이지만 VB6은 그렇지 않습니다. 코드에서 연 레코드 세트는 열린 레코드없이 작동 할 수없는 동적 레코드 세트입니다. 동적 cursortype은 레코드 세트의 모든 변경 사항이 데이터베이스에 즉시 게시됨을 의미합니다. 연결을 종료하면 더 이상 연결할 수 없습니다. 동적 커서가 새 레코드를 추가하려고 시도했을 때 동적 커서가 연결을 찾았으며 찾을 수 없다는 오류가 발생했습니다.

CursorLocation이 여전히 adUseClient인지 확인하는 것이 좋습니다. 그것은해서는 안됩니다. 유형을 동적으로 설정하면 커서는 서버 측이어야합니다. 커서가 고정되어 있거나 사용자의 위치가 서버입니다. 준비가 전체 배치에 대한 잠금 게시 할 때, 다음이 마지막 연결이 끊긴 레코드에 배치 변경과 관련이있다

.CursorLocation = adUseClient 
.CursorType = adOpenStatic 'This is automatic as a result of the previous line 
.LockType = adLockBatchOptimistic 

및 :

그래서, 속성이 있어야 연결이 끊긴 된 레코드를 만들려면 기록을 게시 한 다음 충돌 해결 절차를 진행합니다. 어쨌든 도움이되는지 확인하십시오. 그것해야합니다.

좀 더 자세히 : 클라이언트 측으로 위치를 설정 한 경우 유형은 기본적으로 정적입니다. 클라이언트 쪽에서 작동하는 유일한 cursortype입니다. 종류의 이해가; 클라이언트 측에있는 경우 데이터의 로컬 "스냅 샷"으로 작업하고 있습니다.

Here은 최첨단 소재였던 1999 년의 간단한 설명입니다. :)