2011-01-06 1 views
0

하나의 레코드 세트를 읽고 유사한 레코드 세트에 행을 추가/업데이트하는 루틴이 있습니다. 루틴은 새로운 레코드에 열을 복사하여 시작합니다 :Help! 한 열의 데이터를 비슷한 레코드의 같은 열로 복사하는 중 오류가 발생했습니다

가 여기에 새로운 레코드를 생성하는 코드입니다 .. 꽤 똑바로 앞으로

For X = 1 To aRS.Fields.Count 
    mRS.Fields.Append aRS.Fields(X - 1).Name, aRS.Fields(X - 1).Type, aRS.Fields(X - _ 
      1).DefinedSize, aRS.Fields(X - 1).Attributes 
Next X 

. Type, DefinedSize라는 이름의 복사를 주목하십시오 ...

코드에서 아래로 더 내려 가서 (.. 사이의 열을 수정하는 것도 없습니다) 행의 값을 같은 새로운 레코드 행 :

For C = 1 To aRS.Fields.Count 
    mRS.Fields(C - 1) = aRS.Fields(C - 1) 
Next C 

가 숫자 인 마지막 열 얻는다는 메시지 "오류를 생성 Mutliple 단계 동작"으로 배변.

나는 MS가이 경우 ADO 2.8 인 공급자에 의해 생성 된 오류라고 말합니다. 이 시점에서 DB에 열린 연결도 없습니다.

나는이 작은 머리카락을 남겨 두었습니다 ... (그리고 저는이 시점에서 열 인덱스가 'X'하나의 루프에 있음을 전혀 염두에 두지 않습니다. & 'C'는 다른 것입니다. 내가 진짜 문제가 해결 얻을 때 .. 내가) ... 나중에

+0

"공급자,이 경우 ADO 2.8입니다"- 잘못된 : 공급자 OLE DB 공급자, SQL 서버 네이티브 클라이언트는 것입니다 , ODBC 드라이버 등 데이터 소스를 "아는"구성 요소. ADO는 디자인에 독립적 인 데이터 원본이며 원본에 대해 "알지 못합니다." – onedaywhen

+0

"새 레코드 세트를 만드는 중 ... 이름, 유형, 정의 된 크기 및 특성 복사 중 ... 열을 수정하는 것이 없습니다 ...새 레코드 세트의 행에 값을 복사하는 중입니다. "- 왜이 모든 작업을하고 있는지 궁금합니다 :) Clone 메서드를 사용하여 레코드 세트를 복제 했습니까? b) 필터링 MSDataShape OLE DB 공급자와 함께 SHAPE 구문을 사용하여 두 번째 레코드 집합에 필요한 다른 구조를 얻을 수 있습니까? – onedaywhen

답변

1

당신은 참고로이

For X = 1 To aRS.Fields.Count 
    With aRS.Fields(X - 1) 
     Select Case .Type 
     Case adChar, adWChar, adBinary, _ 
       adVarChar, adVarWChar, adVarBinary, _ 
       adLongVarChar, adLongVarWChar, adLongVarBinary 
      mRS.Fields.Append .Name, .Type, .DefinedSize, .Attributes 
     Case adDecimal, adNumeric 
      mRS.Fields.Append .Name, .Type, , .Attributes 
      mRS.Fields(mRS.Fields.Count - 1).Precision = .Precision 
      mRS.Fields(mRS.Fields.Count - 1).NumericScale = .NumericScale 
     Case Else 
      mRS.Fields.Append .Name, .Type, , .Attributes 
     End Select 
    End With 
Next 

같은 합성 레코드를 열기 전에 adDecimaladNumeric 필드 PrecisionNumericScale을 설정해야합니다 : 당신은 예를 들어, 데이터베이스에서 이름이없는 필드와 레코드를 얻을 수 있습니다

SELECT 5, 'No name' 

하지만 ADO는 Append 방법에 빈 이름을 허용하지 않습니다. 예를 들어 데이터베이스에서 중복 된 필드가있는 레코드 세트를 얻을 수도 있습니다.

SELECT 5 AS Col, 'Second' AS Col 

귀하의 경우에는 Append에 폭탄이 터집니다.

+0

챔피언처럼 일했습니다. 정말 감사드립니다. 누군가가 내 사전 지식에 대한 존중으로 대답 할 때 dge (또는 .. 부족). 문제점 컬럼은 숫자이며, 정밀도는 직선으로 설정됩니다. 고마움 백만 (그것은 긴 & 정수가 아닌 것입니다 ..) –

0

추측이 그것을 변경합니다 : 올바른 라인이 있어야한다

mRS.Fields(C - 1).value = aRS.Fields(C - 1).value 

내 생각 엔 당신이 널을 가지고 있으며 당신은 dbnull 타입을 올바르게 다루지 않습니다.

+0

시도해 보았습니다. 그것은 표준 "IF Not IsNull (ColumnName)"과 같은 결과를 가지고 있습니다.이 경우 열은 128000의 값과 약간의 값을 가진 숫자입니다 ... 또한 두 열과 크기의 특성을 비교했습니다. 모두 잘 보인다 ... –

+0

위의 하나의 아이디어를 참조하십시오. 또한 columnname은 null이 될 수 없습니다 ... null 일 수있는 값이거나 행의 필드가 존재하지 않을 수 있습니다 .. – Hogan

0

다른 접근 방법을 찾는 것에 대한 내 의견을 참조하십시오. 그러나 바로 대답은 Field 개체 'PrecisionNumericScale 속성을 설정해야합니다. 여기에 주석하여 오류의 생식은, 오류 해결하기 위해 두 줄의 :

Sub bfgosdb() 

    On Error Resume Next 
    Kill Environ$("temp") & "\DropMe.mdb" 
    On Error GoTo 0 

    Dim cat 
    Set cat = CreateObject("ADOX.Catalog") 
    With cat 
    .Create _ 
     "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
     "Data Source=" & _ 
     Environ$("temp") & "\DropMe.mdb" 
    With .ActiveConnection 

     Dim Sql As String 

     Sql = _ 
      "CREATE TABLE Test1 " & vbCr & "(" & vbCr & " col1 VARCHAR(255)," & _ 
      " " & vbCr & " col2 INTEGER, " & vbCr & " col3 DECIMAL(19,4)" & vbCr & ");" 
     .Execute Sql 

     Sql = _ 
      "INSERT INTO Test1 (col1, col2, col3) " & vbCr & "VALUES" & _ 
      " (" & vbCr & "'128000 and some change', " & vbCr & "128000, " & vbCr & "128000.1234" & vbCr & ");" 
     .Execute Sql 

     Sql = _ 
      "INSERT INTO Test1 (col1, col2, col3) " & vbCr & "VALUES" & _ 
      " (" & vbCr & "NULL, " & vbCr & "NULL, " & vbCr & "NULL " & vbCr & ");" 
     .Execute Sql 

     Sql = _ 
      "SELECT T11.col1, T11.col2, T11.col3 " & vbCr & " FROM" & _ 
      " Test1 AS T11;" 

     Dim aRS 
     Set aRS = .Execute(Sql) 

     Dim mRS 
     Set mRS = CreateObject("ADODB.Recordset") 

     Dim X As Long 
     For X = 1 To aRS.Fields.Count 
      mRS.Fields.Append aRS.Fields(X - 1).Name, aRS.Fields(X - 1).Type, aRS.Fields(X - _ 
       1).DefinedSize, aRS.Fields(X - 1).Attributes 

'   mRS.Fields(mRS.Fields.Count - 1).NumericScale = aRS.Fields(X - 1).NumericScale ' 
'   mRS.Fields(mRS.Fields.Count - 1).Precision = aRS.Fields(X - 1).Precision ' 
     Next X 

     mRS.Open 

     Do While Not aRS.EOF 

     mRS.AddNew 

     Dim C As Long 
     For C = 1 To aRS.Fields.Count 
      mRS.Fields(C - 1) = aRS.Fields(C - 1) 
     Next C 

     aRS.MoveNext 

     Loop 

    End With 
    Set .ActiveConnection = Nothing 
    End With 
End Sub 
관련 문제