Powershell - данные обновления транзакции ODBC MSAccess Commit для запроса выбора после вставки - PullRequest
0 голосов
/ 03 июля 2018

Я подключаюсь с ODBC в powershell к базе данных доступа .accdb. После вставки новых данных в таблицу (вставка через ExecuteNonQuery) я не могу извлечь данные с помощью команды выбора для дальнейшей обработки (создать таблицу PDF). Результирующий объект запроса пуст (0 строк), хотя «Select @@ IDENTITY» возвращает самый последний индексный идентификатор. Рабочий процесс выглядит примерно так: Данные, введенные в окно форм -> создается новая запись -> данные извлекаются и обрабатываются в отчете -> отчет отправляется по почте -> запись помечается как отправленная

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

Я не нашел никакого рабочего решения этого поведения. Я слышал об этом при использовании форм доступа, где данные будут доступны, когда форма будет перемещена в следующую запись. Любые идеи, как я могу решить это?

Ниже приведены мои функции получения и установки. Как правило, они работают как положено, но использование Set-Data с первой вставкой и последующее использование Get-Data с выбором после выбора не дает никаких записей.

Function Get-Data($SQLCommand){
    try{
        $Connection = New-Object System.Data.Odbc.OdbcConnection($DSN)
        $Connection.Open()
        $AccdbCommand = New-Object System.Data.Odbc.OdbcCommand($SQLCommand, $Connection)
        $AccdbAdapter = New-Object System.Data.Odbc.OdbcDataAdapter($AccdbCommand)
        $AccdbDataSet = New-Object System.Data.DataSet
        $AccdbAdapter.Fill($AccdbDataSet)
        $Connection.Close()
        return $AccdbDataSet
    }
    catch
    {
        [System.Windows.Forms.MessageBox]::Show($_.Exception.Message + "`r`n" + $_.Exception.InnerException, "Fehler",'OK','Error')
    }
}

Function Set-Data($SQLCommand){
    try
    {
        $Connection = New-Object System.Data.Odbc.OdbcConnection($DSN)
        $Connection.Open()

        $Transaction = $Connection.BeginTransaction()

        $AccdbCommand = New-Object System.Data.Odbc.OdbcCommand($SQLCommand, $Connection, $Transaction)
        $AccdbCommand.ExecuteNonQuery()
        $transaction.Commit()

        $AccdbCommand = New-Object System.Data.Odbc.OdbcCommand("Select @@IDENTITY", $Connection)
        $result = $AccdbCommand.ExecuteScalar()

        $Connection.Close()
    }
    catch
    {
        [System.Windows.Forms.MessageBox]::Show($_.Exception.Message + "`r`n" + $_.Exception.InnerException, "Fehler", 'OK', 'Error')
    }
}

1 Ответ

0 голосов
/ 05 июля 2018

Я решил эту проблему. Сам коммит работает как задумано. Отсутствующая запись данных в процессе вывода была результатом ошибки при циклическом построении строк в наборе данных с оператором for.

...