2016-08-03 8 views
0

SQL Serverデータベース内のすべてのデータセットからすべてのデータを削除し、Accessデータベースから新しいデータに置き換えるために作成したインポートプログラムがあります。問題は、最後に「インポートが完了しました!」というメッセージボックスが表示されているにもかかわらず、SQLServerのデータは変わっていないようです。私はここにたくさんのコードがあることを知っていますが、それについての謝罪はありますが、なぜデータが変わらないのか誰にでも示唆することができますか?フルコードを実行していても、TSQLはトランザクションをコミットしません

私の削除ステートメントはすべて1つのトランザクションでなければならないと思っていたのでしょうか?何か不足していますか?

Imports System.Data.OleDb 

Public Class dbImports 

Public Shared Function importDatabase(con As OleDbConnection, importsCon As OleDbConnection) 

    Dim tr As OleDbTransaction = Nothing 
    Dim sql As New OleDbCommand 

    sql.Connection = con 
    sql.CommandType = CommandType.Text 

    Try 

     tr = con.BeginTransaction() 

     sql.CommandText = "DELETE FROM tblModules" 
     sql.Transaction = tr 

     sql.CommandText = "DELETE FROM tblContracts" 
     sql.Transaction = tr 

     sql.CommandText = "DELETE FROM tblContractText" 
     sql.Transaction = tr 

     sql.CommandText = "DELETE FROM tblEmailSettings" 
     sql.Transaction = tr 

     sql.CommandText = "DELETE FROM tblIncidents" 
     sql.Transaction = tr 

     sql.CommandText = "DELETE FROM tblInvoiceLog" 
     sql.Transaction = tr 

     sql.CommandText = "DELETE FROM tblMailLog" 
     sql.Transaction = tr 

     sql.CommandText = "DELETE FROM tblModuleNames" 
     sql.Transaction = tr 

     sql.CommandText = "DELETE FROM tblRecurring" 
     sql.Transaction = tr 

     sql.CommandText = "DELETE FROM tblSystemSettings" 
     sql.Transaction = tr 

     sql.CommandText = "SELECT * FROM tblContracts ORDER BY ContractID" 
     sql.Transaction = tr 

     Dim sqlct As String 
     sqlct = sql.CommandText 

     For Each dr As DataRow In getDataTable(sqlct, importsCon, Nothing).Rows 

      Dim conID As Integer 
      Dim custacc As String 
      Dim datestart As Object 
      Dim daterenew As Object 
      Dim fee As Double 
      Dim agree As String 
      Dim details As String 
      Dim datesent As Object 
      Dim timesent As Object 
      Dim remname As String 
      Dim remmail As String 

      conID = dr("ContractID") 
      custacc = dbToString(dr("CustAcc")) 
      datestart = dbToDate(dr("DateStart")) 
      daterenew = dbToDate(dr("DateRenew")) 
      fee = dr("Fee") 
      agree = dbToString(dr("Agreement")) 
      details = dbToString(dr("OtherDetails")) 
      datesent = dbToDate(dr("DateSent")) 
      timesent = dbToTime(dr("TimeSent")) 
      remname = dbToString(dr("ReminderName")) 
      remmail = dbToString(dr("ReminderEmail")) 

      sql.CommandText = "INSERT INTO tblContracts(ContractID, CustAcc, DateStart, DateRenew, Fee, Agreement, OtherDetails, DateSent, TimeSent, ReminderName, ReminderEmail) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" 
      sql.Transaction = tr 
      sql.Parameters.Add("@ContractID", OleDbType.Integer).Value = conID 
      sql.Parameters.Add("@CustAcc", OleDbType.VarChar).Value = custacc 
      sql.Parameters.Add("@DateStart", OleDbType.DBDate).Value = datestart 
      sql.Parameters.Add("@DateRenew", OleDbType.DBDate).Value = daterenew 
      sql.Parameters.Add("@Fee", OleDbType.Double).Value = fee 
      sql.Parameters.Add("@Agreement", OleDbType.VarChar).Value = agree 
      sql.Parameters.Add("@OtherDetails", OleDbType.VarChar).Value = details 
      sql.Parameters.Add("DateSent", OleDbType.DBDate).Value = datesent 
      sql.Parameters.Add("@TimeSent", OleDbType.DBTime).Value = timesent 
      sql.Parameters.Add("@ReminderName", OleDbType.VarChar).Value = remname 
      sql.Parameters.Add("@remmail", OleDbType.VarChar).Value = remmail 

     Next 

     sql.CommandText = "SELECT * FROM tblContractText ORDER BY pk" 
     sql.Transaction = tr 
     sqlct = sql.CommandText 

     For Each dr As DataRow In getDataTable(sqlct, importsCon, Nothing).Rows 

      Dim Para1 As String 
      Dim pk As Integer 
      Dim BillPara As String 

      Para1 = dbToString(dr("Para1")) 
      pk = dr("pk") 
      BillPara = dbToString(dr("BillPara")) 

      sql.CommandText = "INSERT INTO tblContractText(Para1, pk, BillPara) VALUES(?, ?, ?)" 
      sql.Transaction = tr 
      sql.Parameters.Add("@Para1", OleDbType.LongVarChar).Value = Para1 
      sql.Parameters.Add("@pk", OleDbType.Integer).Value = pk 
      sql.Parameters.Add("@BillPara", OleDbType.LongVarChar).Value = BillPara 

     Next 

     sql.CommandText = "SELECT * FROM tblEmailSettings ORDER BY ID" 
     sql.Transaction = tr 
     sqlct = sql.CommandText 

     For Each dr As DataRow In getDataTable(sqlct, importsCon, Nothing).Rows 

      Dim ID As String 
      Dim PW As String 
      Dim Subject As String 
      Dim Body As String 
      Dim SMTP As String 
      Dim conf As Boolean 
      Dim invSub As String 
      Dim invBody As String 

      ID = dbToString(dr("ID")) 
      PW = dbToString(dr("PW")) 
      Subject = dbToString(dr("Subject")) 
      Body = dbToString(dr("Body")) 
      SMTP = dbToString(dr("SMTPHost")) 
      conf = dbToBoolean(dr("Confirmation")) 
      invSub = dbToString(dr("invSubject")) 
      invBody = dbToString(dr("invBody")) 

      sql.CommandText = "INSERT INTO tblEmailSettings(ID, PW, Subject, Body, SMTPHost, Confirmation, invSubject, invBody) VALUES(?, ?, ?, ?, ?, ?, ?, ?)" 
      sql.Transaction = tr 
      sql.Parameters.Add("@ID", OleDbType.VarChar).Value = ID 
      sql.Parameters.Add("@PW", OleDbType.VarChar).Value = PW 
      sql.Parameters.Add("@Subject", OleDbType.VarChar).Value = Subject 
      sql.Parameters.Add("@Body", OleDbType.LongVarChar).Value = Body 
      sql.Parameters.Add("@SMTPHost", OleDbType.VarChar).Value = SMTP 
      sql.Parameters.Add("@Confimation", OleDbType.Boolean).Value = conf 
      sql.Parameters.Add("@invSubject", OleDbType.LongVarChar).Value = invSub 
      sql.Parameters.Add("@invBody", OleDbType.LongVarChar).Value = invBody 

     Next 

     sql.CommandText = "SELECT * FROM tblIncidents ORDER BY supportID" 
     sql.Transaction = tr 
     sqlct = sql.CommandText 

     For Each dr As DataRow In getDataTable(sqlct, importsCon, Nothing).Rows 

      Dim supportID As Integer 
      Dim clientName As String 
      Dim dateStart As Object 
      Dim dateEnd As Object 
      Dim incidentProblem As String 
      Dim timeStart As Object 
      Dim timeEnd As Object 
      Dim incidentSolved As Boolean 
      Dim incidentSolution As String 

      supportID = (dr("supportID")) 
      clientName = dbToString(dr("clientName")) 
      dateStart = dbToDate(dr("dateStart")) 
      dateEnd = dbToDate(dr("dateEnd")) 
      incidentProblem = dbToString(dr("incidentProblem")) 
      timeStart = dbToTime(dr("timeStart")) 
      timeEnd = dbToTime(dr("timeEnd")) 
      incidentSolved = dbToBoolean(dr("incidentSolved")) 
      incidentSolution = dbToString(dr("incidentSolution")) 

      sql.CommandText = "INSERT INTO tblIncidents(supportID, clientName, dateStart, dateEnd, incidentProblem, timeStart, timeEnd, incidentSolved, incidentSolution) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)" 
      sql.Transaction = tr 
      sql.Parameters.Add("@supportID", OleDbType.Integer).Value = supportID 
      sql.Parameters.Add("@clientName", OleDbType.VarChar).Value = clientName 
      sql.Parameters.Add("@dateStart", OleDbType.DBDate).Value = dateStart 
      sql.Parameters.Add("@dateEnd", OleDbType.DBDate).Value = dateEnd 
      sql.Parameters.Add("@incidentProblem", OleDbType.LongVarChar).Value = incidentProblem 
      sql.Parameters.Add("@timeStart", OleDbType.DBTime).Value = timeStart 
      sql.Parameters.Add("@timeEnd", OleDbType.DBTime).Value = timeEnd 
      sql.Parameters.Add("@incidentSolved", OleDbType.Boolean).Value = incidentSolved 
      sql.Parameters.Add("@incidentSolution", OleDbType.LongVarChar).Value = incidentSolution 

     Next 

     sql.CommandText = "SELECT * FROM tblInvoiceLog ORDER BY BatchNumber" 
     sql.Transaction = tr 
     sqlct = sql.CommandText 

     For Each dr As DataRow In getDataTable(sqlct, importsCon, Nothing).Rows 

      Dim BatchNumber As Integer 
      Dim BatchLine As Integer 
      Dim DatePosted As Object 
      Dim AccCode As String 
      Dim Description As String 
      Dim Period As String 
      Dim TotalFee As Double 

      BatchNumber = dr("BatchNumber") 
      BatchLine = dr("BatchLine") 
      DatePosted = dbToDate(dr("DatePosted")) 
      AccCode = dbToString(dr("AccCode")) 
      Description = dbToString(dr("Description")) 
      Period = dbToString(dr("Period")) 
      TotalFee = dr("TotalFee") 

      sql.CommandText = "INSERT INTO tblInvoiceLog(BatchNumber, BatchLine, DatePosted, AccCode, Description, Period, TotalFee) VALUES(?, ?, ?, ?, ?, ?, ?)" 
      sql.Transaction = tr 
      sql.Parameters.Add("@BatchNumber", OleDbType.Integer).Value = BatchNumber 
      sql.Parameters.Add("@BatchLine", OleDbType.Integer).Value = BatchLine 
      sql.Parameters.Add("@DatePosted", OleDbType.DBDate).Value = DatePosted 
      sql.Parameters.Add("@AccCode", OleDbType.VarChar).Value = AccCode 
      sql.Parameters.Add("@Description", OleDbType.LongVarChar).Value = Description 
      sql.Parameters.Add("@Period", OleDbType.VarChar).Value = Period 
      sql.Parameters.Add("@TotalFee", OleDbType.Double).Value = TotalFee 

     Next 

     sql.CommandText = "SELECT * FROM tblMailLog ORDER BY mailID" 
     sql.Transaction = tr 
     sqlct = sql.CommandText 

     For Each dr As DataRow In getDataTable(sqlct, importsCon, Nothing).Rows 

      Dim mailID As Integer 
      Dim Sender As String 
      Dim Receiver As String 
      Dim FileName As String 
      Dim DateSent As Object 
      Dim TimeSent As String 
      Dim Body As String 
      Dim AccCode As String 

      mailID = dr("mailID") 
      Sender = dbToString(dr("Sender")) 
      Receiver = dbToString(dr("Receiver")) 
      FileName = dbToString(dr("FileName")) 
      DateSent = dbToDate(dr("DateSent")) 
      TimeSent = dbToString(dr("TimeSent")) 
      Body = dbToString(dr("Body")) 
      AccCode = dbToString(dr("AccCode")) 

      sql.CommandText = "INSERT INTO tblMailLog(mailID, Sender, Receiver, FileName, DateSent, TimeSent, Body, AccCode) VALUES(?, ?, ?, ?, ?, ?, ?, ?)" 
      sql.Transaction = tr 
      sql.Parameters.Add("@mailID", OleDbType.Integer).Value = mailID 
      sql.Parameters.Add("Sender", OleDbType.VarChar).Value = Sender 
      sql.Parameters.Add("Receiver", OleDbType.VarChar).Value = Receiver 
      sql.Parameters.Add("@FileName", OleDbType.VarChar).Value = FileName 
      sql.Parameters.Add("@DateSent", OleDbType.DBDate).Value = DateSent 
      sql.Parameters.Add("@TimeSent", OleDbType.VarChar).Value = TimeSent 
      sql.Parameters.Add("@Body", OleDbType.LongVarChar).Value = Body 
      sql.Parameters.Add("@AccCode", OleDbType.VarChar).Value = AccCode 

     Next 

     sql.CommandText = "SELECT * FROM tblModuleNames" 
     sql.Transaction = tr 
     sqlct = sql.CommandText 

     For Each dr As DataRow In getDataTable(sqlct, importsCon, Nothing).Rows 

      Dim fModule As String 

      fModule = dbToString(dr("Module")) 

      sql.CommandText = "INSERT INTO tblModuleNames(Module) VALUES(?)" 
      sql.Transaction = tr 
      sql.Parameters.Add("@Module", OleDbType.VarChar).Value = fModule 

     Next 

     sql.CommandText = "SELECT * FROM tblModules ORDER BY ModuleID" 
     sql.Transaction = tr 
     sqlct = sql.CommandText 

     For Each dr As DataRow In getDataTable(sqlct, importsCon, Nothing).Rows 

      Dim ModuleID As Integer 
      Dim ModuleName As String 
      Dim NumberUsers As String 
      Dim License As String 
      Dim Username As String 
      Dim ContractID As Integer 

      ModuleID = dr("ModuleID") 
      ModuleName = dbToString(dr("ModuleName")) 
      NumberUsers = dbToString(dr("NumberUsers")) 
      License = dbToString(dr("License")) 
      Username = dbToString(dr("Username")) 
      ContractID = dr("ContractID") 

      sql.CommandText = "INSERT INTO tblModules(ModuleID, ModuleName, NumberUsers, License, Username, ContractID) VALUES(?, ?, ?, ?, ?, ?)" 
      sql.Transaction = tr 
      sql.Parameters.Add("@ModuleID", OleDbType.Integer).Value = ModuleID 
      sql.Parameters.Add("@ModuleName", OleDbType.VarChar).Value = ModuleName 
      sql.Parameters.Add("@NumberUsers", OleDbType.VarChar).Value = NumberUsers 
      sql.Parameters.Add("@License", OleDbType.VarChar).Value = License 
      sql.Parameters.Add("@Username", OleDbType.VarChar).Value = Username 
      sql.Parameters.Add("ContractID", OleDbType.Integer).Value = ContractID 

     Next 

     sql.CommandText = "SELECT * FROM tblRecurring ORDER BY billID" 
     sql.Transaction = tr 
     sqlct = sql.CommandText 

     For Each dr As DataRow In getDataTable(sqlct, importsCon, Nothing).Rows 

      Dim billID As Integer 
      Dim DateStart As Object 
      Dim DateNext As Object 
      Dim Fee As Double 
      Dim Description As String 
      Dim AccountCode As String 
      Dim Notes As String 

      billID = dr("billID") 
      DateStart = dbToDate(dr("DateStart")) 
      DateNext = dbToDate(dr("DateNext")) 
      Fee = dr("Fee") 
      Description = dbToString(dr("Description")) 
      AccountCode = dbToString(dr("AccountCode")) 
      Notes = dbToString(dr("Notes")) 

      sql.CommandText = "INSERT INTO tblRecurring(billID, DateStart, DateNext, Fee, Description, AccountCode, Notes) VALUES(?, ?, ?, ?, ?, ?, ?)" 
      sql.Transaction = tr 
      sql.Parameters.Add("@billID", OleDbType.Integer).Value = billID 
      sql.Parameters.Add("@DateStart", OleDbType.DBDate).Value = DateStart 
      sql.Parameters.Add("@DateNext", OleDbType.DBDate).Value = DateNext 
      sql.Parameters.Add("@Fee", OleDbType.Double).Value = Fee 
      sql.Parameters.Add("@Description", OleDbType.LongVarChar).Value = Description 
      sql.Parameters.Add("@AccountCode", OleDbType.VarChar).Value = AccountCode 
      sql.Parameters.Add("@Notes", OleDbType.LongVarChar).Value = Notes 

     Next 

     sql.CommandText = "SELECT * FROM tblSystemSettings ORDER BY ID" 
     sql.Transaction = tr 
     sqlct = sql.CommandText 

     For Each dr As DataRow In getDataTable(sqlct, importsCon, Nothing).Rows 

      Dim ID As Integer 
      Dim listContractsX As Integer 
      Dim listContractsY As Integer 
      Dim invoiceLogX As Integer 
      Dim invoiceLogY As Integer 
      Dim mailLogX As Integer 
      Dim mailLogY As Integer 
      Dim recurringX As Integer 
      Dim recurringY As Integer 
      Dim reportsX As Integer 
      Dim reportsY As Integer 

      ID = dr("ID") 
      listContractsX = dr("listContractsX") 
      listContractsY = dr("listContractsY") 
      invoiceLogX = dr("invoiceLogX") 
      invoiceLogY = dr("invoiceLogY") 
      mailLogX = dr("mailLogX") 
      mailLogY = dr("mailLogY") 
      recurringX = dr("recurringX") 
      recurringY = dr("recurringY") 
      reportsX = dr("reportsX") 
      reportsY = dr("reportsY") 

      sql.CommandText = "INSERT INTO tblSystemSettings(ID, listContractsX, listContractsY, invoiceLogX, invoiceLogY, mailLogX, mailLogY, recurringX, recurringY, reportsX, reportsY) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" 
      sql.Transaction = tr 
      sql.Parameters.Add("@ID", OleDbType.Integer).Value = ID 
      sql.Parameters.Add("@listContractsX", OleDbType.Integer).Value = listContractsX 
      sql.Parameters.Add("@listContractsY", OleDbType.Integer).Value = listContractsY 
      sql.Parameters.Add("@invoiceLogX", OleDbType.Integer).Value = invoiceLogX 
      sql.Parameters.Add("@invoiceLogY", OleDbType.Integer).Value = invoiceLogY 
      sql.Parameters.Add("@mailLogX", OleDbType.Integer).Value = mailLogX 
      sql.Parameters.Add("@mailLogY", OleDbType.Integer).Value = mailLogY 
      sql.Parameters.Add("@recurringX", OleDbType.Integer).Value = recurringX 
      sql.Parameters.Add("@recurringY", OleDbType.Integer).Value = recurringY 
      sql.Parameters.Add("@reportsX", OleDbType.Integer).Value = reportsX 
      sql.Parameters.Add("@reportsY", OleDbType.Integer).Value = reportsY 

     Next 

     tr.Commit() 
     MsgBox("Import Completed!") 

    Catch ex As Exception 

     tr.Rollback() 

     Throw 
    End Try 

End Function 

    Public Shared Function getDataTable(ByVal sqlct As String, importsCon As OleDbConnection, tr As OleDbTransaction) As DataTable 

    Dim sql As OleDbCommand 
    Dim da As OleDbDataAdapter 
    Dim dt As New DataTable 

    If tr IsNot Nothing Then 
     sql = New OleDbCommand(sqlct, importsCon, tr) 
    Else 
     sql = New OleDbCommand(sqlct, importsCon) 
    End If 

    da = New OleDbDataAdapter(sql) 
    da.Fill(dt) 

    Return dt 

End Function 
+1

あなたは、単一の 'OleDbCommand'オブジェクトにあまりにも多くの異なった事をやろうとしているように私には見えます。あなたは 'sql'と名前をつけたものを操作していますが、DELETEとUPDATEを実行するために' .ExecuteNonQuery'を呼び出さない限り見ることができます。そして、異なるINSERTに 'sql'オブジェクトを再利用しようとすると、新しいパラメータを追加する前に古いパラメータを取り除くために' sql.Parameters.Clear'を呼び出すことはありません。 –

+0

@ GordThompsonだから、私はDELETE/INSERTごとに新しい 'OleDbCommand'を作るべきですか?または、それぞれが実行した後に '.ExecuteNonQuery'を呼び出しますか? –

+1

'.ExecuteNonQuery'を呼び出すだけで本当に必要です。単純に' .CommandText'を更新し、 '.ExecuteNonQuery'を呼び出すだけでDELETEを呼び出すことができます。ただし、INSERTループごとに別々の 'OleDbCommand'オブジェクトを使用し、' .Prepare'メソッドを調べて、繰り返し挿入操作を実行するときにコードの効率を向上させることを検討してください。 –

答えて

1

そのコマンドがデータベースで実行されるように、明示的ExecuteNonQuery関数を呼び出す必要があります。

例:

sql.Parameters.Clear 
sql.CommandText = "DELETE FROM tblModules" 
sql.Transaction = tr 
sql.ExecuteNonQuery() 

sql.Parameters.Clear 
sql.CommandText = "DELETE FROM tblContracts" 
sql.Transaction = tr 
sql.ExecuteNonQuery() 

... 
0

データが変更されていないため、削除ステートメントが実行されていないと思います。データベースに正しく接続していますか? これは私が通常何をすべきかです:

Using sqlCon as new sqlConnection(sqlConString) 
    Using sqlCmd as new sqlCommand("DELETE FROM tbl", slqCon) 
     If sqlCmd.ExecuteNonQuery > 0 Then 
      //Delete successful. Import new data. 
     End If 
    End Using 
End Using   

あなたは簡単にすべてのテーブルからではなく、それぞれ1を定義するデータを削除するために、これを試すことができます。データベースの下にあるすべてのテーブルからデータを削除する場合にのみ、これを使用します。

編集:あなたはすでに接続を通過しているので、各CommandTextをした後

Using sqlCmd as new sqlCommand("DECLARE @SQL VARCHAR(MAX) 
            SET @SQL = 'DELETE FROM ?' 
            EXEC sp_MSForEachTable @SQL", con) 
     //con.Open If you haven't opened it through another method. 
     If sqlCmd.ExecuteNonQuery > 0 Then 
      //Delete successful. Import new data. 
     End If 
    End Using 
+0

はい、どちらも正しいパス(iniファイルから読み込まれているので、動作しなかった場合にはスローしてエラーになります)を開いた状態で接続を確認しました。だから、このコードを使って、どこに置くのですか? –

+0

importDatabaseの下にあります。最初にdelete文をコメントアウトし、sqlConStringを独自の接続文字列に変更してください。 –

+0

クラスを呼び出すときにすでに接続文字列を渡していますが、それでもやり直す必要がありますか? –

関連する問題