Вставка / копирование записей из таблицы базы данных Access в удаленную базу данных MySQL по одной - PullRequest
0 голосов
/ 10 января 2019

Я хочу вставить записи таблицы из базы данных Access на удаленный сервер MySQL.

Мой метод:

  • загрузка базы данных Access от первой до последней записи в TextBox с циклом
  • проверка, если запись уже вставлена ​​в удаленную базу данных MySQL
  • если нет, то вставьте его один за другим

Код выдает сообщение об ошибке:

значение не может быть нулевым параметром mode: Data-source

Мой код здесь:

SQLda = New MySqlDataAdapter(("INSERT INTO approved (word, approveds) Select * FROM (SELECT '" & TextBox3.Text & "', 'No') AS tmp WHERE Not EXISTS (SELECT word FROM approved WHERE word= '" & TextBox3.Text & "') LIMIT 1"), MysqlConn)

MysqlConn = New MySqlConnection
ListBox1.Items.Clear()

MysqlConn.ConnectionString = "server=localhost;userid=root;password=;port=3306;database=sindhila_spellchecker;Character Set=utf8;SslMode=none;"

SQLda = New MySqlDataAdapter(("SELECT * FROM approved"), MysqlConn)
SQLda.Fill(dbds, "doctors")
DataGridView1.DataSource = dbds.Tables("doctors")

Try
    MysqlConn.Open()
    MessageBox.Show("Connection Successful, click ok to continue")
    Label3.Visible = True

    romantranssql = "Select * from approved order by id"

    pth = My.Application.Info.DirectoryPath
    romantransconn.ConnectionString = "Provider=Microsoft.ace.oledb.12.0; Data Source=" & pth & "\database.mdb; User Id=admin; Password=;"
    romantransda = New OleDbDataAdapter(romantranssql, romantransconn)
    romantransds = New DataSet
    romantransda.Fill(romantransds, "DisplayCenterData")
    romantransdt = romantransds.Tables("DisplayCenterData")
    romantranscmb = New OleDbCommandBuilder(romantransda)

    Do Until Me.BindingContext(romantransdt).Position = Me.BindingContext(romantransdt).Count - 1

        TextBox3.DataBindings.Clear()
        TextBox3.DataBindings.Add("text", romantransdt, "word")

        MysqlConn = New MySqlConnection

        MysqlConn.ConnectionString = "server=localhost;userid=root;password=;port=3306;database=sindhila_spellchecker;Character Set=utf8;"

        SQLda = New MySqlDataAdapter(("INSERT INTO approved (word, approveds) Select * FROM (SELECT '" & TextBox3.Text & "', 'No') AS tmp WHERE Not EXISTS (SELECT word FROM approved WHERE word= '" & TextBox3.Text & "') LIMIT 1"), MysqlConn)
        SQLda.Fill(dbds, "approved")

        DataGridView1.DataSource = dbds.Tables("approved")
        romantransdtx = dbds.Tables("approved")
        Me.BindingContext(romantransdtx).Position = 0
        Me.BindingContext(romantransdt).Position = Me.BindingContext(romantransdt).Position + 1
        Me.Refresh()
    Loop

    MsgBox("all New records have been uploded To server")
    Label3.Visible = False

    MysqlConn.Close()

Catch ex As Exception
    MessageBox.Show(ex.Message)
Finally
    MysqlConn.Dispose()

End Try

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Это не точный / прямой ответ на ваш вопрос, а скорее предложение

Я был бы честен здесь, ваш код выглядит некрасиво и в некоторых местах, это также не имеет смысла. Давайте начнем с безобразия. Вот моя любимая цитата об этом (кстати, моя цитата):

Вы потратите 20% своего времени на написание кодов и 80% своего времени на его обслуживание.

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

Почему

MysqlConn = New MySqlConnection
MysqlConn.ConnectionString = "...."

Где это можно сделать, как

MysqlConn = New MySqlConnection("....")

Да, даже одна строка кода имеет значение. Это может не иметь никакого влияния на выполнение вообще, но это имеет большое влияние на его внешний вид. Попробуйте исправить это.

Теперь давайте немного поговорим о некоторых бесполезных кодах, которые у вас есть.

SQLda = New MySqlDataAdapter(("INSERT INTO.....")), MysqlConn)
...
SQLda = New MySqlDataAdapter(("SELECT * FROM approved"), MysqlConn)

Если SQLda ни для чего не используется до присвоения ему нового значения, то зачем вообще было присвоить ему значение? Ну, я могу ошибаться , если вы не опубликовали весь свой код ..

Теперь вы используете здесь оператор Try-Catch. Почему вы перехватываете все возможные исключения, используя класс Exception, тогда как вы можете просто перехватить конкретное исключение, которое действительно может произойти здесь, например SqlException? Поймать (Исключение) - плохая идея. Подробнее здесь

Вы открываете свое соединение с базой данных, и когда все готово, вы закрываете его и удаляете его (вызывая метод Dispose). Зачем столько шума, когда вы можете просто использовать оператор Using, поскольку класс SqlConnection уже реализует IDisposable?

Итак, вместо этого:

 Dim MySqlConn = New SqlConnection("...")
 MySqlConn.Open()
 .....
 .....
 MySqlConn.Close()
 MySqlConn.Dispose()

Сделайте это

Using MySqlConn = New SqlConnection("....")
...
End Using

Несколько заключительных слов

Твой код заставляет меня чувствовать, что это маленький проект. Но для будущих проектов вот несколько советов, которым настоятельно рекомендуется следовать:

  • Никогда не сохраняйте строку подключения в коде или локальных файлах

Хранить строки подключения в конфигурационных файлах, таких как app.config или web.config.

  • Никогда не передавайте значения операторам SQL напрямую, вместо этого используйте параметры

Написание кодов для передачи прямых значений просто открывает двери для SQL-инъекций. Поэтому всегда передавайте параметры.

  • Не скрывать / показывать элементы управления, а создавать / удалять их из кода при необходимости

Вы можете создать элемент управления (Label в вашем случае) в вашей форме и скрыть его, а затем отобразить его при необходимости. Но это будет стоить вам ресурсов. Если вы используете 1 или даже 5 ярлыков, возможно, не будет израсходовано слишком много ресурсов ... Но у нас не только пользовательский интерфейс только с ярлыками, не так ли? Вскоре вы поймете, что миллисекунда увеличения производительности или производительности проходит долгий путь. Таким образом, создавать / удалять элементы управления программно при необходимости. Это сделает GarbageCollector огромную услугу.

  • Никогда не используйте какой-либо объект / класс / что-либо, не понимая его должным образом

Вы используете DataTable с. Вы знаете, сколько памяти он потребляет? Более легкая альтернатива - IEnumerable(T) (общий список), такой как List. Или даже простой DataReader - лучший вариант, когда дело касается производительности.

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

В сообществе разработчиков есть печально известный мем. Это выглядит так:

Когда я писал код, только бог, и я знал, как это работает ... Теперь только бог знает, как это работает.

Всегда добавляйте полезные комментарии в коде. Это может не принести вам прямой выгоды, но поможет будущим разработчикам, которые будут отлаживать ваш код. Также в Visual Studio добавьте ключевое слово #region, чтобы разделить коды на секции.

Полагаю, этого пока достаточно. Я надеюсь, что вы найдете это полезным.

Ура!

0 голосов
/ 12 января 2019

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

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim RetVal As Integer
    Dim InsertQuery = "INSERT INTO dbusers (myuser, mypassword)
                      Select  @name, @pass
                      WHERE Not EXISTS
                      (SELECT * FROM dbusers WHERE myuser = @name AND mypassword = @pass);"
    Using cn As New MySqlConnection(My.Settings.dbusersConnection)
        Using cmd As New MySqlCommand(InsertQuery, cn)
            cmd.Parameters.Add("@name", MySqlDbType.VarChar).Value = TextBox1.Text
            cmd.Parameters.Add("@pass", MySqlDbType.VarChar).Value = TextBox2.Text
            cn.Open()
            RetVal = cmd.ExecuteNonQuery
        End Using
    End Using
    If RetVal = 1 Then
        MessageBox.Show("Success")
    Else
        MessageBox.Show("Failure")
    End If
End Sub
...