2016-08-19 4 views
0

Вот моя проблема: У меня есть код ниже. Если я отлаживаю свой код и копирую запросы непосредственно в MS Access, запросы работают отлично, но если я его выполнил из моего приложения, никаких изменений в таблице не будет сделано.VB.Net OLEDB ExecuteNonQuery INSERT INTO - Не влияет на базу данных

Обратите внимание, что соединение с БД выполняется в порядке, поскольку я выполняю несколько операций выбора до того, как они работают отлично.

Я, вероятно, делаю что-то глупое, но оно настолько велико, что я не вижу его после многих часов работы над ним.

Я знаю, что должен использовать параметры в своем запросе, и я сделал это первоначально, но я изменяю его в своих попытках заставить его работать, и я полагаю, что это не должно сильно меняться.

Dim cmd As New OleDbCommand 
    Dim sQuery As String = String.Empty 

    Try 
     cmd.CommandText = "DELETE * FROM tbl_Invoices" 
     cmd.ExecuteNonQuery() 
    Catch ex As Exception 
     MsgBox("PrepareInvoicing Delete" & vbCrLf & ErrorToString()) 
     Exit Sub 
    End Try 

    'Insert into the Invoice table the fleet info with Usage for the invoicing period selected 
    Try 
     sQuery = String.Empty 
     sQuery = sQuery & "INSERT INTO tbl_Invoices " 
     sQuery = sQuery & "SELECT tbl_Fleet.CustomerName AS CustomerName, " 
     sQuery = sQuery & "tbl_Fleet.CountryCode AS CountryCode, " 
     sQuery = sQuery & "#" & DateSerial(InvoicingYear, InvoicingMonth + 1, 0) & "# AS InvoiceDate, " 
     sQuery = sQuery & "tbl_Fleet.Area AS Area, " 
     sQuery = sQuery & "tbl_Fleet.Group AS [Group], " 
     sQuery = sQuery & "tbl_Fleet.Site_nm AS SiteName, " 
     sQuery = sQuery & "tbl_Sites.RCS AS CustomerPO, " 
     sQuery = sQuery & "tbl_Fleet.Site_Addr_1 AS SiteAddress1, " 
     sQuery = sQuery & "tbl_Fleet.Site_Addr_2 AS SiteAddress2, " 
     sQuery = sQuery & "tbl_Fleet.Site_Addr_ZIP AS ZIP, " 
     sQuery = sQuery & "tbl_Fleet.Site_Addr_cty AS City, " 
     sQuery = sQuery & "tbl_Fleet.model_nm AS ProductDescription, " 
     sQuery = sQuery & "tbl_Fleet.product_no AS ProductNumber, " 
     sQuery = sQuery & "tbl_Fleet.serial_no AS SerialNumber, " 
     sQuery = sQuery & "tbl_Fleet.hostname AS hostname, " 
     sQuery = sQuery & "tbl_Fleet.asset_no AS AssetNumber, " 
     sQuery = sQuery & "tbl_Fleet.Grid AS Grid, " 
     sQuery = sQuery & "tbl_Fleet.ChangeOrderID AS ChangeOrderID, " 
     sQuery = sQuery & "tbl_Fleet.install_date AS InstalledDate, " 
     sQuery = sQuery & "INT(((tbl_Fleet.install_date - temptbl_CO.ChangeOrderStartDate)/365.25)+1) AS YearInContract, " 
     sQuery = sQuery & "(tbl_RM.BlackClicks + tbl_RM.AccentClicks) AS BlackPages, " 
     sQuery = sQuery & "(tbl_RM.ColorClicks + tbl_RM.ProfessionalColorClicks) AS ColorPages " 
     sQuery = sQuery & "FROM tbl_Fleet, " 
     sQuery = sQuery & "tbl_Sites, " 
     sQuery = sQuery & "tbl_RM, " 
     sQuery = sQuery & "(SELECT DISTINCT tbl_Bases.ProductNumber, tbl_Bases.ChangeOrderID, tbl_Bases.ChangeOrderStartDate FROM tbl_Bases WHERE tbl_Bases.CustomerName = '" & mdlGlobalStuff.SelectedCustomerName & "' AND tbl_Bases.CountryCode = '" & mdlGlobalStuff.SelectedCountryCode & "') AS temptbl_CO " 
     sQuery = sQuery & "WHERE tbl_Fleet.CustomerName = '" & mdlGlobalStuff.SelectedCustomerName & "' " 
     sQuery = sQuery & "AND tbl_Fleet.CountryCode = '" & mdlGlobalStuff.SelectedCountryCode & "' " 
     sQuery = sQuery & "AND tbl_Fleet.LoadDate = #" & LoadFleetDate & "# " 
     sQuery = sQuery & "AND MONTH(tbl_RM.RMDate) = " & Month(LoadUsageDate) & " " 
     sQuery = sQuery & "AND YEAR(tbl_RM.RMDate) = " & Year(LoadUsageDate) & " " 
     sQuery = sQuery & "AND tbl_Fleet.CustomerName = tbl_Sites.CustomerName " 
     sQuery = sQuery & "AND tbl_Fleet.CountryCode = tbl_Sites.CountryCode " 
     sQuery = sQuery & "AND tbl_Fleet.Site_nm = tbl_Sites.Site_nm " 
     sQuery = sQuery & "AND tbl_Fleet.CustomerName = tbl_RM.CustomerName " 
     sQuery = sQuery & "AND tbl_Fleet.CountryCode = tbl_RM.CountryCode " 
     sQuery = sQuery & "AND tbl_Fleet.serial_no = tbl_RM.SerialNumber " 
     sQuery = sQuery & "AND tbl_Fleet.product_no = temptbl_CO.ProductNumber " 
     sQuery = sQuery & "AND tbl_Fleet.ChangeOrderID = temptbl_CO.ChangeOrderID " 
     cmd.CommandText = sQuery 
     cmd.ExecuteNonQuery() 
     MsgBox("Step 1") 
    Catch ex As Exception 
     MsgBox("PrepareInvoicing: Invoicing step 1" & vbCrLf & ErrorToString()) 
     Exit Sub 
    End Try 

    'Update the "non aging" Bases (if Base.contractYear = 0) in the Invoice table 
    Try 
     sQuery = String.Empty 
     sQuery = sQuery & "UPDATE tbl_Invoices " 
     sQuery = sQuery & "INNER JOIN tbl_Bases ON tbl_Bases.ProductNumber = tbl_Invoices.ProductNumber " 
     sQuery = sQuery & "AND tbl_Bases.ChangeOrderID = tbl_Invoices.ChangeOrderID " 
     sQuery = sQuery & "SET tbl_Invoices.Base = tbl_Bases.BasePrice " 
     sQuery = sQuery & "WHERE tbl_Bases.CustomerName = '" & mdlGlobalStuff.SelectedCustomerName & "' " 
     sQuery = sQuery & "AND tbl_Bases.CountryCode = '" & mdlGlobalStuff.SelectedCountryCode & "' " 
     sQuery = sQuery & "AND tbl_Bases.ContractYear = 0 " 
     cmd.CommandText = sQuery 
     cmd.ExecuteNonQuery() 
     MsgBox("Step 2") 
    Catch ex As Exception 
     MsgBox("PrepareInvoicing: Invoicing step 2" & vbCrLf & ErrorToString()) 
     Exit Sub 
    End Try 

    'Update the "aging" Bases (if Base.contractYear <> 0) in the Invoice table 
    Try 
     sQuery = String.Empty 
     sQuery = sQuery & "UPDATE tbl_Invoices " 
     sQuery = sQuery & "INNER JOIN tbl_Bases ON tbl_Bases.ProductNumber = tbl_Invoices.ProductNumber " 
     sQuery = sQuery & "AND tbl_Bases.ChangeOrderID = tbl_Invoices.ChangeOrderID " 
     sQuery = sQuery & "AND tbl_Bases.ContractYear = tbl_Invoices.YearInContract " 
     sQuery = sQuery & "SET tbl_Invoices.Base = tbl_Bases.BasePrice " 
     sQuery = sQuery & "WHERE tbl_Bases.CustomerName = '" & mdlGlobalStuff.SelectedCustomerName & "' " 
     sQuery = sQuery & "AND tbl_Bases.CountryCode = '" & mdlGlobalStuff.SelectedCountryCode & "' " 
     cmd.CommandText = sQuery 
     cmd.ExecuteNonQuery() 
     MsgBox("Done") 
    Catch ex As Exception 
     MsgBox("PrepareInvoicing: Invoicing step 3" & vbCrLf & ErrorToString()) 
     Exit Sub 
    End Try 
+1

Вы уверены, что связались со строкой? Эти симптомы - сильная подсказка, что что-то там плохо и в конфигурации ваших файлов проекта. Не могли бы вы разместить строку соединения? (Конечно, Sql Injection и проблемы синтаксического анализа идут дальше) – Steve

+0

В качестве стартера вы можете попробовать что-то простое вставить в свой стол? Таким образом, вы знаете, что это проблема соединения или проблема синтаксиса запроса ... Также ExecuteNonQuery() возвращает целое число, указывающее, сколько строк было затронуто, попробуйте также отобразить это значение ... –

+0

Когда вы вызываете 'ExecuteNonQuery', есть только три возможных результата.Это может вызвать исключение, и в этом случае что-то пошло не так; он может возвращать ноль, и в этом случае изменений для сохранения не было; он может вернуть ненулевое значение, и в этом случае были сохранены изменения, и они были сохранены. Что это в вашем случае? Чаще всего это не вариант 3, а это означает, что все работает так, как должно, и человек просто ищет не то место и/или в неподходящее время для данных. Если это относится к вам, я могу предоставить соответствующий ответ, который предполагает установку одного свойства. – jmcilhinney

ответ

2

Я собираюсь идти дальше и публиковать это как ответ, потому что, исходя из моего опыта, он может быть применим как минимум на 95%.

Когда вы добавляете локальный файл данных, например. MDB или ACCDB, в ваш проект он копируется в папку проекта вместе со всеми другими исходными файлами. Этот файл является частью вашего проекта, а не частью вашего приложения. Любые изменения схемы или данные по умолчанию добавляются в этот файл, но во время тестирования он не затрагивается во время выполнения.

Когда вы строите проект, этот исходный файл копируется в выходную папку вместе с вашим EXE. Это тот экземпляр, с которым работает ваше приложение во время выполнения. Все сохраненные данные сохраняются в этой рабочей копии, а не в исходном файле.

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

Итак, ошибка, которую вы, вероятно, делаете, как и многие, заключается в том, что вы либо смотрите в исходный файл для данных, которые вы сохранили во время выполнения, либо смотрите в рабочей копии после того, была перезаписана следующей сборкой. Решение этой «проблемы» прост. Выберите файл данных в обозревателе решений, откройте окно «Свойства» и установите для свойства Copy to Output Directory значение Copy if Newer. Это означает, что при сборке рабочая копия будет только перезаписана, если исходный файл будет более новым, что будет иметь место, если вы изменили схему или отредактировали данные по умолчанию. Если вам нужно обновить рабочую базу данных, вы просто удалите ее вручную из выходной папки или временно установите Copy to Output Directory обратно на Copy Always.

Вы можете задаться вопросом, почему они используют несколько файлов в первую очередь, но это совершенно логично и на самом деле очень хорошо. Если у вас был только один файл, и вы использовали его для тестирования, что произойдет, когда придет время для развертывания? Вам придется тратить время на очистку этого файла, а затем вы можете что-то пропустить. Таким образом, вы просто продолжаете использовать свою копию Debug для тестирования, и при создании сборки вы всегда получите хороший чистый файл данных.

+0

Спасибо МНОГО! :-) это оно. Я просто чувствую себя глупо, но сейчас все работает. –