J_Mohan Ответов: 2

Почему только первая запись добавлена в другую таблицу.


Привет Друзья,

Я пытаюсь перенести каждую запись из таблицы доступа с именем Emp_master в LeaveMastr. После выполнения кода обнаруживается, что в LeaveMaster добавлена только первая запись длиной до Emp_master. Мои коды Ара следующим образом:

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

Sub DataTrans()
   Dbconnection.Open()

   Dim StrArr(2) As String 

   MasterReader = MasterCmd.ExecuteReader()

   Try
      While MasterReader.Read()
         StrArr(0) = (MasterReader("CPF_No".ToString))
         StrArr(1) = (MasterReader("Name".ToString))
         StrArr(2) = (MasterReader("Designation".ToString))

         Try
            LvMasterCmd.CommandText = "INSERT INTO LeaveMaster" &
                                         "(CPF_No, Name, Designation,  MNT, YR, LeaveStatus)" &
                                         "VALUES ( @CPF_No, @Name, @Designation,  @MNT, @YR, @LeaveStatus) ;"

            LvMasterCmd.Parameters.AddWithValue("@CPF_No", StrArr(0))
            LvMasterCmd.Parameters.AddWithValue("@Name", StrArr(1))
            LvMasterCmd.Parameters.AddWithValue("@Designation", StrArr(2))

            LvMasterCmd.Parameters.AddWithValue("@MNT", CmbMonth.Text)
            LvMasterCmd.Parameters.AddWithValue("@YR", CmbYear.Text)
            LvMasterCmd.Parameters.AddWithValue("@LeaveStatus", "N")

            LvMasterCmd.ExecuteNonQuery()

         Catch ex As Exception
         End Try

      End While

   Catch ex As Exception
      MessageBox.Show(ex.Message)
   End Try
   Dbconnection.Close()
End Sub

Richard MacCutchan

Вам нужно показать свою оригинальную команду SELECT. Вы также должны проверить количество записей, возвращаемых первым ExecuteNonQuery. И наконец, не кодируйте пустые блоки Catch, это означает, что вы никогда не узнаете, вызывает ли этот код исключение.

J_Mohan

Модуль Module1

Общественные MasterCmd как новый объект oledbcommand("Select * из Emp_Master", соединение с БД)
Public MasterAdapter As New OleDbDataAdapter(MasterCmd)
'Public AddEmpCommandbuilder As New OleDbCommandBuilder(AddEmpAdapter)
Public MasterDataSet Как Новый Набор Данных
Общественные MasterReader Как И Oledbdatareader

Общественные LvMasterCmd как новый объект oledbcommand("Select * из LeaveMaster", соединение с БД)
Public LvMasterAdapter As New OleDbDataAdapter(LvMasterCmd)
'Public OnyEmpCommandbuilder As New OleDbCommandBuilder(OnYAdapter)
Public LvMasterDataSet Как Новый Набор Данных
Общественные LvMasterReader Как И Oledbdatareader
Конечный Модуль

2 Ответов

Рейтинг:
2

OriginalGriff

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

While MasterReader.Read()

    StrArr(0) = (MasterReader("CPF_No".ToString))
    StrArr(1) = (MasterReader("Name".ToString))
    StrArr(2) = (MasterReader("Designation".ToString))
    
    Try
        LvMasterCmd.CommandText = "INSERT INTO LeaveMaster" &
        "(CPF_No, Name, Designation, MNT, YR, LeaveStatus)" &
        "VALUES ( @CPF_No, @Name, @Designation, @MNT, @YR, @LeaveStatus) ;"
        
        LvMasterCmd.Parameters.AddWithValue("@CPF_No", StrArr(0))
        LvMasterCmd.Parameters.AddWithValue("@Name", StrArr(1))
        LvMasterCmd.Parameters.AddWithValue("@Designation", StrArr(2))
        
        LvMasterCmd.Parameters.AddWithValue("@MNT", CmbMonth.Text)
        LvMasterCmd.Parameters.AddWithValue("@YR", CmbYear.Text)
        LvMasterCmd.Parameters.AddWithValue("@LeaveStatus", "N")
        
        
        LvMasterCmd.ExecuteNonQuery()
    Catch ex As Exception
        ' EXCEPTION SWALLOWED HERE
    End Try

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


J_Mohan

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

OriginalGriff

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

Что показывает отладчик?

J_Mohan

Dibuggre ничего не показывает & код работает гладко, и я использую правильную БД. Каждый раз после выполнения я вижу первую запись EMP_Master в LvMaster. Я чень запустить код в режиме приостановки и нашли после каждого цикла чтения считывает соответствующие записи, т. е.
StrArr(0) = (MasterReader("CPF_No".Метод toString))
StrArr(1) = (MasterReader("Имя".Метод toString))
StrArr(2) = (MasterReader("Обозначение".Метод toString))

OriginalGriff

Если отладчик ничего не показывает, значит, вы используете его неправильно! :смеяться:
Даже негативы здесь важны.
Что именно вы сделали с отладчиком и что он показал? Как и когда вы проверили базу данных?

J_Mohan

Я запускаю код в режиме перерыва, коды работают гладко, и я проверяю БД сразу после выполнения кода, пожалуйста, помогите..

OriginalGriff

Итак, вы поставили точку останова, и вы шагнули через нее - что именно произошло? Я не вижу твоего экрана!

А как вы проверили базу данных? И когда же? После ExecuteNonQuery? После того, как приложение закрылось? Что вы использовали для проверки? Куда ты смотрела?

J_Mohan

Да, сэр, я поставил точку останова для отладки подпрограммы остальной части кода, выполняемой нажатием клавиши F11. Коды выполняются шаг за шагом, и экран не показывает никаких ошибок. Я проверяю БД сразу после закрытия приложения по пути, указанному в строке подключения. БД-это таблица базы данных Access.

OriginalGriff

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

Рейтинг:
2

Richard Deeming

Вам нужно очистить параметры на каждой итерации цикла.

Вы также можете переместить код, который устанавливает CommandText вне петли, так как это не меняется.

LvMasterCmd.CommandText = "INSERT INTO LeaveMaster" &
                          "(CPF_No, Name, Designation,  MNT, YR, LeaveStatus)" &
                          "VALUES ( @CPF_No, @Name, @Designation,  @MNT, @YR, @LeaveStatus) ;"

While MasterReader.Read()
    StrArr(0) = (MasterReader("CPF_No".ToString))
    StrArr(1) = (MasterReader("Name".ToString))
    StrArr(2) = (MasterReader("Designation".ToString))

    Try
        LvMasterCmd.Parameters.Clear() ' <-- ADD THIS LINE            
        
        LvMasterCmd.Parameters.AddWithValue("@CPF_No", StrArr(0))
        LvMasterCmd.Parameters.AddWithValue("@Name", StrArr(1))
        LvMasterCmd.Parameters.AddWithValue("@Designation", StrArr(2))
        LvMasterCmd.Parameters.AddWithValue("@MNT", CmbMonth.Text)
        LvMasterCmd.Parameters.AddWithValue("@YR", CmbYear.Text)
        LvMasterCmd.Parameters.AddWithValue("@LeaveStatus", "N")
        LvMasterCmd.ExecuteNonQuery()
     
    Catch ex As Exception
        MessageBox.Show(ex.ToString())
    End Try
End While


0x01AA

"Вам нужно очистить параметры", действительно уверены в этом? Это не соответствует моему опыту. Теперь я в замешательстве ...

Richard Deeming

Да:

using (var connection = new SqlConnection("server=.;integrated security=true"))
using (var command = new SqlCommand("SELECT @A", connection))
{
    command.Parameters.AddWithValue("@A", 1);
    command.Parameters.AddWithValue("@A", 2);
    // SqlException: The variable name '@A' has already been declared. Variable names must be unique within a query batch or stored procedure.
}

Поскольку обработчик исключений в цикле проглатывал это исключение, добавлялась только первая запись. Все последующие записи обрывались беззвучно.

0x01AA

Теперь я понял. Большое спасибо.