2016-08-19 16 views
0

への影響は私の問題ではない: 私は以下のコードを持っています。 私のコードをデバッグし、クエリをMS Accessに直接コピーすると、クエリは完璧に機能しますが、アプリケーションから実行するとテーブルに変更は加えられません。VB.Net OLEDBは、ExecuteNonQuery INSERT INTO - ここでは、データベース

私はいくつかの選択を行う前に完全にうまくいっているので、DBへの接続はOKです。

は、私はおそらく愚かな何かを作っていますが、私はそれに取り組んで多くの時間後にそれを見ることができないので、大きいです。

は、私は私のクエリでパラメータを使用する必要があります知っていると私はもともとなかったが、私は多くの人がそれを動作させるためにしようと、私の中でそれを変更し、私はこれがとにかく多くを変更しないでくださいと仮定します。

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注入と解析の問題は次のようになります) – Steve

+0

初心者として、あなたのテーブルに簡単に挿入することができますか?あなたが接続の問題かクエリ構文の問題かどうかを知る方法です... ExecuteNonQuery()は、影響を受ける行の数を示す整数を返します。この値を表示しようとします。 –

+0

'ExecuteNonQuery'を呼び出すと可能な結果は3つだけです。例外をスローすることができます。その場合、何かが間違っていました。ゼロを返すことができます。この場合、保存するための変更はありません。 0以外の値を返すことができます。この場合、保存する変更があり、保存されました。あなたの場合はどちらですか?多くの場合、それはそれは人が単に間違った場所におよび/またはデータの間違った時に見ている必要がありますようにすべてが動作していることを意味し、オプション3、ではないということ。その場合は、私は単一のプロパティを設定することを含む適切な答えを提供することができます。 – jmcilhinney

答えて

2

これは私の経験に基づいて、適用可能性が高いため、これを回答として投稿します。

ローカルデータファイルを追加すると、 MDBまたはACCDBファイルをプロジェクトに追加すると、他のすべてのソースファイルと共にプロジェクトフォルダにコピーされます。そのファイルはプロジェクトの一部であり、アプリケーションの一部ではありません。スキーマの変更やデフォルトのデータがそのファイルに追加されますが、テスト中は実行時には触れません。

プロジェクトをビルドすると、そのソースファイルがEXEと共に出力フォルダにコピーされます。実行時にアプリケーションが動作するコピーです。保存したデータは、ソースファイルではなく、その作業コピーに保存されます。

デフォルトでは、ソースファイルの新しいコピーが作成され、ビルドするたびに作業コピーが上書きされます。つまり、デバッガでアプリケーションを実行し、データを保存し、アプリケーションを停止し、コードを変更してからアプリケーションを再実行すると、保存したデータは消えます。

だから、あなたはおそらく非常に多くのように、作っている間違いは、あなたがいずれかの実行時に保存されたデータのソースファイルで探しているということですか、それは持っていた後、あなたは作業コピーで探しています次のビルドによって上書きされました。この「問題」に対する解決策は簡単です。ソリューションエクスプローラでデータファイルを選択し、プロパティウィンドウを開き、Copy to Output DirectoryプロパティをCopy if Newerに設定します。これは、ビルド時に、ソースファイルが新しい場合にのみ作業コピーが上書きされることを意味します。これは、スキーマを変更したか、デフォルトのデータを編集した場合に発生します。作業データベースを更新する必要がある場合は、出力フォルダから手動で削除するか、一時的にCopy to Output DirectoryCopy Alwaysに戻してください。

最初に複数のファイルを使用する理由は不思議に思うかもしれませんが、それは完全に論理的で実際は非常に良いことです。あなたが1つのファイルしか持っておらず、それをテストのために使用した場合、展開するときにはどうなりますか?あなたはそのファイルを掃除する時間を無駄にしなければならず、とにかく何かを見逃すかもしれません。こうすることで、デバッグコピーをテスト用に使用し続けるだけで、リリースビルドを実行するときに常にきれいなデータファイルが得られます。

+0

おかげでたくさん! :-) これだよ。私はばかばかしいと感じるが、すべてが今働いている。 –

関連する問題