2015-02-18 2 views
4

Я пытаюсь разобрать CSV-файл в приложении VB6, чтобы обновить несколько записей в таблице на SQL с уже существующим кодом для обновления одной записи. Файлы CSV будут иметь строку заголовка whixh, которая может использоваться для проверки информации, поступающей в нужное место в наборе записей ADODB. В C++ вы можете использовать карту, чтобы сказать, какСтрока VB6 для целых чисел для заголовков

map<String s, int x> column 
column<"First Name", -1> 
column<"Last Name",-1> 

Затем создайте счетчик поперек разделенных запятыми значений, где, если третье значение является Фамилия, то код может быть написан, чтобы изменить столбец < «Фамилия», -1> в столбец < «Фамилия», 3> и если x! = -1 на любой из карт, файл действителен для использования, я бы затем прокрутил оставшиеся записи и проанализировал их в контейнере, используя что-то похожее на

strLastName = Array<column[3]> 

, чтобы присвоить значения записи правильным переменным. Я все еще очень новичок в VB6, как я могу сделать что-то подобное в VB6 и какие контейнеры следует использовать? До сих пор я

Public Sub GetImportValues() 
On Error GoTo GetImportValues_Error: 
Dim intFileNum As Integer 

Open Path For Input As #intFileNum 

Do Until EOF(intFileNum) 

Line Input #intFileNum, vbCrLf 

FunctionThatSavesInformationToSQL 

Loop 

Close #intFileNum 



GetImportValues_Exit: 
    Exit Sub 

GetImportValues_Error: 
    Err.Source = "frmMemberAdd.GetImportValues" & " | " & Err.Source 
    Err.Raise Err.Number, Err.Source, Err.Description 
End Sub 

с диалоговым окном, возвращающая путь в виде строки, используя App.path в отдельной функции

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

+1

Вы можете использовать VB6? Я только спрашиваю, потому что это очень старая и устаревшая техника, и использование VB.Net или C# было бы намного проще (и современно, поэтому все, что вы узнаете, будет более применимо в будущем). – xxbbcc

+0

Это не мой выбор, я должен использовать VB6 для этого приложения. Обычно я использую C# – Davidp04

ответ

4

Если я правильно понял ваш вопрос, вы пытаетесь создать карту (Dictionary<string, int> в C#). В VB6 вы можете использовать Collection для этой цели - это примерно эквивалентно C# Dictionary<string, object>. Он использует ключи String и сохраняет все значения как Variant. Например:

Dim oColl As Collection 

Set oColl = New Collection 
oColl.Add -1, "ColumnName" 

Dim nColumnIndex As Long 

'Get column index for column name. 
nColumnIndex = oColl.Item("ColumnName") 

If nColumnIndex = -1 Then 
    nColumnIndex = ... 

    'When you want to update a column index in the collection, you 
    'first have to remove the item and then add it back with the right 
    'index. 
    oColl.Remove "ColumnName" 
    oColl.Add nColumnIndex, "ColumnName" 
End If 

Edit 1:

Одно слово предостережения относительно VB6: вы будете видеть много образцов делают это:

Dim oObj As New SomeClass 

Это нормально, чтобы сделать это в VB. Net, но никогда не делают этого в VB6. Объявляйте и создавайте экземпляр объекта в отдельных операторах, потому что форма одного оператора генерирует код, где oObj проверяется на Nothing и устанавливает экземпляр перед каждым использованием. Это замедляет ваш код (ненужные проверки) и создает труднодоступные ошибки, если вы используете экземпляр, который должен быть удален.

Всегда делать это вместо:

Dim oObj As SomeClass 
Set oObj = New SomeClass 
... 

'Clean up the object when you're done with it. Remember, there's 
'no garbage collection in COM/VB6, you have to manage object 
'lifetimes. 
Set oObj = Nothing 

Кроме того, использование Long вместо Integer столько, сколько вы можете - Long является 32-разрядным целым числом, а Integer только 16 бит. Имена типов VB6 могут часто вводить в заблуждение. Here's an old answer с чуть более подробной информацией (строго не связан с вашим вопросом, но полезен).

В качестве альтернативы вы можете создать упрощенную оболочку класса .NET Dictionary и представить ее как объект COM: это позволит вам вызвать ее из VB6.Вероятно, это будет (несколько) медленнее, чем Collection, и для этого потребуется .NET Framework для запуска вашего проекта VB6.

Edit 2:

Как прокомментировал @CMaster, Dictionary доступен из Microsoft Scripting Runtime библиотеки - вам необходимо добавить ссылку на него, чтобы использовать его (именно поэтому я предпочитаю Collection - это не зависимость) , This answer содержит информацию о том, как его использовать.

+1

. Если вы хотите использовать словарь в VB6, вы можете сделать это проще. Проект -> Ссылки -> Время выполнения сценариев Microsoft. Это делает класс словаря доступным для использования. – CMaster

+0

@CMaster Вы правы - я обновлю свой ответ с вашего комментария. Я забыл о классе Dictionary, так как Collection является частью VB напрямую, и существует ряд лучших реализаций для быстрой замены коллекции. – xxbbcc

+0

спасибо, что это было очень полезно – Davidp04