Символ уже определен иначе VB

Я пытаюсь скомпилировать следующий код и постоянно получаю сообщение об ошибке. Я получал эту ошибку несколько раз, поэтому мне пришлось использовать обходные функции. На этот раз я действительно устал от этой проблемы, и мне нужно знать, что здесь не так.

sub SQL_AddTestResults (byval sData as string, byval testID as integer)

   dim i as integer
   dim dataChain as string
   dim aData (Split(sData, ";").length) as string

   aData = Split(sData, ";")

   for i = 0 to aData.Length

      if(i = 4) then
          goto skip
      elseif (i = 68) then
          goto skip
      elseif (i = 72) then
          goto skip
      end if

      if(i = aData.length) then
          dataChain = dataChain & aData(i)
      else
          dataChain = dataChain & aData(i) & ", "
      end if

      skip:
   next

   MsgBox (dataChain)

   SQL_statement = "INSERT INTO ""TestData"" VALUES (" & dataChain & ");"   
   Stmt = connection.createStatement()
   Stmt.executeUpdate(SQL_statement)
end sub 

Компиляция этого кода дает мне следующую ошибку в строке «для i = 0 to aData.Length»:

Основная синтаксическая ошибка.

Символ aData уже определен по-другому.

Понятия не имею, почему. Извините, если это тривиальная проблема, но я совершенно новичок в VB. C++ не подготовил меня к этому.


person gEdringer    schedule 29.08.2016    source источник


Ответы (3)


Массивы в классическом VB не имеют свойства «длина». Я не уверен, откуда вы это взяли.

Способ получить границы массива в классическом VB — с помощью функций LBound и UBound.

for i = LBound(aData) to UBound(aData)

Таким образом, вы даже можете обрабатывать массивы, у которых не 0 в качестве начального индекса, так как да, одна из замечательных особенностей VB заключается в том, что он позволяет вам использовать любой диапазон чисел для ваших индексов.

VB6 не тот язык, который я бы рекомендовал для новой разработки. Если вы пытаетесь узнать что-то новое, есть много других вариантов. Как вы, несомненно, заметили, все труднее найти документацию о том, как работает классический VB и чем он отличается от VBScript и VB.NET. Если вам нужно поддерживать старую кодовую базу VB6, я бы порекомендовал найти где-нибудь подержанную книгу, в которой рассказывается о синтаксисе и использовании VB6.

person Community    schedule 29.08.2016
comment
Тег в вопросе предполагает, что он использует язык макросов, вдохновленный VB, в LibreOffice, поэтому у него, вероятно, нет большого выбора в этом вопросе. :-) - person Cody Gray; 29.08.2016
comment
@CodyGray Ну, я не так хорошо знаком с этим языком, поэтому я предположил, что тег vb6 означает, что он использует VB6 и просто каким-то образом подключается с ним к LibreOffice. Надеюсь, ответ в любом случае будет полезен. Удивительно, как продолжает появляться все больше и больше языков, называемых Basic. - person ; 30.08.2016

Попробуйте этот код с исправленным кодом:

sub SQL_AddTestResults (byval sData as string, byval testID as integer)
dim i as integer
dim dataChain as string
dim aData as variant

aData = Split(sData, ";")

for i = 0 to ubound(aData)

  if(i = 4) then
      goto skip
  elseif (i = 68) then
      goto skip
  elseif (i = 72) then
      goto skip
  end if

  if(i = ubound(aData)) then
      dataChain = dataChain & aData(i)
  else
      dataChain = dataChain & aData(i) & ", "
  end if

  skip:
  next
  MsgBox (dataChain)

  SQL_statement = "INSERT INTO ""TestData"" VALUES (" & dataChain & ");"   
  Stmt = connection.createStatement()
  Stmt.executeUpdate(SQL_statement)
end sub 
person Balasubramaniyan Ramadoss    schedule 30.08.2016

Насколько я мог понять, вы определяете aData дважды, но по-разному -

dim aData (Split(sData, ";").length) as string

aData = Split(sData, ";")

aData length вернет целое число фактической длины, в то время как вы просите его вернуть строку, и вы используете его в своем целочисленном цикле для i в качестве счетчика.

Сразу после этого вы говорите ему вернуть только некоторые данные, вызывающие сбой. Вместо этого используйте другой номинатор для хранения двух разных типов возвращаемой информации, которая вам нужна:

dim aData (Split(sData, ";").length) as Long ''Rather use long as the length might exceed the integer type. Use the same for i, change integer to long

Dim bData = Split(sData, ";") as String

for i = 0 to aData.Length

  if(i = 4) then
      goto skip
  elseif (i = 68) then
      goto skip
  elseif (i = 72) then
      goto skip
  end if

  if(i = aData.length) then
      dataChain = dataChain & bData(i)
  else
      dataChain = dataChain & bData(i) & ", "
  end if

  skip:
next
person AlwaysConfused    schedule 29.08.2016