Member 13363527 Ответов: 3

Вставка текстовых полей и значений полей со списком в VB6 в MS access 2010


Вот мой код;

Явный Параметр
Общественный кон как новый объект adodb.Подключение
Общественные РС как новый объект adodb.Записей
-----------------------------------------------------------------------------
Private Sub cmdadd_Click()
Дим рез как струна
Dim SQLSTR как строка
Тусклое Сужение Как Струна
Set rs = New ADODB. Recordset
ConString= "поставщика=Майкрософт.джет.oledb для.4.0;Источник данных="D:\My проект в VB6\трубчатый колодец.# то # "
Набор кон = новый объект adodb.Подключение
против.ConnectionString = ConString
res = MsgBox("вы хотите добавить эту запись?", vbQuestion + vbYesNo, " добавить сотрудника")
Если res = vbYes, то
кон.Открыть
SQLSTR = " вставить в Employee_Details(EmpNo,Employee_Name,Status)values('"&txtempno&"','"&empname&"','"&Combo1&"')"
con. Execute SQLSTR
кон.Рядом
Set con = ничего
Конец, Если
Конец Подводной Лодки

Когда я запускаю проект, я получаю;
Сообщение об ошибке" Expected: End of Statement".

Пожалуйста, помогите мне.

Что я уже пробовал:

Вот мой код;

Явный Параметр
Общественный кон как новый объект adodb.Подключение
Общественные РС как новый объект adodb.Записей
-----------------------------------------------------------------------------
Private Sub cmdadd_Click()
Дим рез как струна
Dim SQLSTR как строка
Тусклое Сужение Как Струна
Set rs = New ADODB. Recordset
ConString= "поставщика=Майкрософт.джет.oledb для.4.0;Источник данных="D:\My проект в VB6\трубчатый колодец.# то # "
Набор кон = новый объект adodb.Подключение
против.ConnectionString = ConString
res = MsgBox("вы хотите добавить эту запись?", vbQuestion + vbYesNo, " добавить сотрудника")
Если res = vbYes, то
кон.Открыть
SQLSTR = " вставить в Employee_Details(EmpNo,Employee_Name,Status)values('"&txtempno&"','"&empname&"','"&Combo1&"')"
con. Execute SQLSTR
кон.Рядом
Set con = ничего
Конец, Если
Конец Подводной Лодки

Когда я запускаю проект, я получаю;
Сообщение об ошибке" Expected: End of Statement".

Пожалуйста, помогите мне.

CHill60

Разве вы не должны использовать выбранное значение из Combo1, а не сам элемент управления?

3 Ответов

Рейтинг:
2

Jochen Arndt

Попробуйте завершить оператор точкой с запятой и заключить ключевое слово VALUE пробелами:

SQLSTR = "INSERT INTO Employee_Details (EmpNo,Employee_Name,Status) VALUES ('" & txtempno & "','" & empname & "','" & Combo1 & "');"
Я также вставил дополнительные пробелы и использовал все заглавные буквы для ключевых слов. Это не обязательно, но улучшает читабельность.


CHill60

5 б.
Если ОП говорит, что они все еще получают ошибку, то попробуйте удалить одинарные кавычки вокруг txtempno (хотя из памяти сообщение об ошибке должно было быть другим)

Jochen Arndt

Спасибо.

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

Когда txtempno является числовым, должны быть ошибки преобразования / несоответствия типов, но не пропущен конец оператора.

Member 13363527

Привет,
SQL-оператор работает, и спасибо за это. Но теперь я получаю следующую ошибку времени выполнения.
Ошибка времени выполнения - '446';
Объект не поддерживает именованные аргументы.
против.ConString = "поставщика=Майкрософт.Джет.oledb для.4.0;Источник данных=D:\в мой проект в VB6\трубчатый колодец.код # то # " будет помечено желтым.

Мое полное кодирование выглядит следующим образом;
Явный Параметр
Общественный кон как новый объект adodb.Подключение
Общественные РС как новый объект adodb.Записей
Private Sub cmdadd_Click()
Дим рез как струна
Dim SQLSTR как строка
Тусклое Сужение Как Струна
Set rs = New ADODB. Recordset
против.ConString = "поставщика=Майкрософт.Джет.oledb для.4.0;Источник данных=D:\в мой проект в VB6\трубчатый колодец.# то # "
Набор кон = новый объект adodb.Подключение
- кон.ConnectionString = ConString
res = MsgBox("вы хотите добавить эту запись?", vbQuestion + vbYesNo, " добавить сотрудника")
Если res = vbYes, то
кон.Открыть
SQLSTR = "вставить в Employee_Details(EmpNo,Имя_сотрудника,статус) ценности ('" &амп; txtempno &ампер; "','" &амп; txtempname &ампер; "','" &амп; Combo1 &ампер; "');"
con. Execute SQLSTR
кон.Рядом
Set con = ничего
Конец, Если
Конец Подводной Лодки
Частная суб cmdcancel_Click()
Разгрузить Меня
Конец Подводной Лодки

Пожалуйста, помогите мне.

Jochen Arndt

Объект ADODB. Connection не имеет ограничивающего элемента.
Должно быть, это кон.ConnectionString, как это было использовано в вашем первоначальном вопросе (и прокомментировано в приведенном выше фрагменте кода).

Member 13363527

Нет. Это не работает. появляется та же ошибка.

Member 13363527

Это не работает.
Ошибка;
Ошибка времени выполнения - '446';
Объект не поддерживает именованные аргументы.

Jochen Arndt

Вы читали комментарий от CHill60?

Я думаю, что это еще одна проблема, которая не была обнаружена раньше, когда команда SQL была inavlid.

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

Member 13363527

Теперь я получаю следующее сообщение об ошибке.
Ошибка времени выполнения - 3709
Запрошенная операция требует as Oledb Session object, который не поддерживается текущим поставщиком.

Пожалуйста, помогите мне в этом.

Рейтинг:
2

Patrice T

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь уязвимости под названием "SQL injection", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользователь вводит имя типа "Брайан О'Коннер", это может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL Injection-руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL-OWASP[^]
-----
Приобретите привычку делать отступы в своем коде, это помогает читать:

Option Explicit
Public con As New ADODB.Connection
Public rs As New ADODB.Recordset
-----------------------------------------------------------------------------
Private Sub cmdadd_Click()
    Dim res As String
    Dim SQLSTR As String
    Dim ConString As String
    Set rs = New ADODB.Recordset
    ConString= "provider=Microsoft.jet.oledb.4.0;Data Source="D:\My Project VB6\Tubewell.accdb"
    Set con = New ADODB.Connection
    con.ConnectionString = ConString
    res = MsgBox("Do you want to add this record?", vbQuestion + vbYesNo, "Add Employee")
    If res = vbYes Then
        con.Open
        SQLSTR = "Insert into Employee_Details(EmpNo,Employee_Name,Status)values('"&txtempno&"','"&empname&"','"&Combo1&"')"
        con.Execute SQLSTR
        con.Close
        Set con = Nothing
    End If
End Sub

Office Automation Ltd. - Умный Индентор[^]
Установка Smart Indenter в Office 2013-2016[^]


Рейтинг:
0

Richard Deeming

Начните с фиксации SQL-инъекция[^] уязвимость в вашем коде.

Параметризация запросов-это не так довольно в VBA все так же просто, как и в .NET, но это не так уж плохо:
Добавление и пример метода CreateParameter (ВБ) | Майкрософт документы[^]

Что-то вроде этого должно сработать:

Private Sub cmdadd_Click()
    If MsgBox("Do you want to add this record?", vbQuestion + vbYesNo, "Add Employee") <> vbYes Then
        Exit Sub
    End If
    
    Dim ConString As String
    ConString= "provider=Microsoft.jet.oledb.4.0;Data Source=""D:\My Project VB6\Tubewell.accdb"""
    
    Dim con As ADODB.Connection
    Set con = New ADODB.Connection
    con.ConnectionString = ConString
    
    Dim cmd As ADODB.Command
    Set cmd = New ADODB.Command
    cmd.ActiveConnection = con
    cmd.CommandText = "INSERT INTO Employee_Details (EmpNo, Employee_Name, Status) VALUES (?, ?, ?)"
    
    Dim p As ADODB.Parameter
    
    Set p = cmd.CreateParameter(, adInteger, adParamInput, , txtempno.Text)
    cmd.Parameters.Append p
    
    Set p = cmd.CreateParameter(, adVarChar, adParamInput, 50, empname.Text)
    cmd.Parameters.Append p
    
    Set p = cmd.CreateParameter(, adVarChar, adParamInput, 10, Combo1.Value)
    cmd.Parameters.Append p

    con.Open
    cmd.Execute
    con.Close
End Sub

NB: Вам нужно будет изменить размеры параметров для параметров имени и состояния, чтобы они соответствовали базе данных.


Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]