Помогите!Ошибка при копировании данных из одного столбца в один и тот же столбец в похожем наборе записей - PullRequest
0 голосов
/ 07 января 2011

У меня есть процедура, которая читает один набор записей и добавляет / обновляет строки в аналогичном наборе записей. Процедура начинается с копирования столбцов в новый набор записей:

Вот код для создания нового набора записей ..

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

Довольно прямо. Обратите внимание на копирование имени, типа, определенного размера и атрибутов ...

Далее в коде (и нет ничего, что изменяет какой-либо из столбцов между ...) Я копирую значения строки в строку в новом наборе записей следующим образом:

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

Когда он добирается до последнего столбца, который является числовым, он получает сообщение «Операция Mutliple-Step Generated of error».

Я знаю, что MS говорит, что это ошибка, сгенерированная провайдером, в данном случае ADO 2.8. На данный момент нет открытого соединения с БД.

Я тяну за волосы, которые у меня остались, на этом ... (и на данный момент мне все равно, что индекс столбца - «X» в одном цикле и «C» в другом ... Я изменю это позже, когда решу реальную проблему ...)

Ответы [ 3 ]

1 голос
/ 07 января 2011

Вы должны установить Precision и NumericScale для adDecimal и adNumeric полей, прежде чем открывать синтетический набор записей, например, такой:

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

.не имеет имени из базы данных, например

SELECT 5, 'No name'

, но ADO не допустит пустое имя для метода Append.Вы также можете получить набор записей с повторяющимися полями из базы данных, например,

SELECT 5 AS Col, 'Second' AS Col

, который в вашем случае будет бомбардировать также Append.

0 голосов
/ 07 января 2011

Пожалуйста, смотрите мои комментарии о поиске альтернативного подхода, но прямой ответ - свойства Field objects 'Precision и NumericScale. Вот повтор вашей ошибки, раскомментируйте две строки, чтобы исправить ошибку:

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
0 голосов
/ 07 января 2011

Угадай 2: правильная строка должна быть

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

Полагаю, у вас есть ноль, и вы не правильно относитесь к типу dbnull.

...