Вот моя проблема: У меня есть код ниже. Если я отлаживаю свой код и копирую запросы непосредственно в 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
Вы уверены, что связались со строкой? Эти симптомы - сильная подсказка, что что-то там плохо и в конфигурации ваших файлов проекта. Не могли бы вы разместить строку соединения? (Конечно, Sql Injection и проблемы синтаксического анализа идут дальше) – Steve
В качестве стартера вы можете попробовать что-то простое вставить в свой стол? Таким образом, вы знаете, что это проблема соединения или проблема синтаксиса запроса ... Также ExecuteNonQuery() возвращает целое число, указывающее, сколько строк было затронуто, попробуйте также отобразить это значение ... –
Когда вы вызываете 'ExecuteNonQuery', есть только три возможных результата.Это может вызвать исключение, и в этом случае что-то пошло не так; он может возвращать ноль, и в этом случае изменений для сохранения не было; он может вернуть ненулевое значение, и в этом случае были сохранены изменения, и они были сохранены. Что это в вашем случае? Чаще всего это не вариант 3, а это означает, что все работает так, как должно, и человек просто ищет не то место и/или в неподходящее время для данных. Если это относится к вам, я могу предоставить соответствующий ответ, который предполагает установку одного свойства. – jmcilhinney