1

私はVB.NETにかなり慣れていないので、簡単な問題だと思っています。DB にクエリを実行し、結果をデータセットに保存してから、同じ DB にクエリを実行し、DELETE タスクの結果を結合しようとしています。誰かが支援する瞬間があれば、これが私がこれまでに持っているものです。前もって感謝します。 また; 誰かに直してもらうよりも、自分が間違っていたことを学ぶ方が好きです。

   Private Sub cmdDelete_Click(sender As System.Object, e As System.EventArgs) Handles cmdDelete.Click
    'Set/Open Connection
    Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\youngje\Documents\SQL Server Management Studio\Projects\Nwind.accdb")
    con.Open()

    'Set TIMEID
    Dim Yr, Mnth, fRng As String
    Yr = Year(Now)
    Mnth = Format(Month(Now), "00")
    fRng = Yr + Mnth + "00"

    'Query 1/Fill Temp Table (tmp)
    Dim cmdA As OleDbCommand = New OleDbCommand("SELECT PRODUCT, SHIPTO, TIMEID " & _
                                                "FROM tblFactSales " & _
                                                "WHERE (BILLTO = 'INPUT_BILLTO') AND (BRANCHPLANT = 'INPUT_BRANCHPLANT') AND (FRTHANDLE = 'INPUT_FRTHANDLE') AND (DATATYPE = 'FORECAST') AND (TIMEID > '" & fRng & "' )" & _
                                                "AND (SIGNEDDATA >= - .01) AND (SIGNEDDATA <= .01) AND (SALESDATA = 'short_tons')", con)

    'Query 2, joined with Query 1
    Dim cmdB As OleDbCommand = New OleDbCommand("DELETE FS " & _
                                                "FROM tblFactSales as FS INNER JOIN tmp T" & _
                                                "ON FS.PRODUCT=T.PRODUCT AND FS.SHIPTO=T.SHIPTO AND FS.TIMEID=T.TIMEID " & _
                                                "WHERE (FS.DATATYPE = 'FORECAST') AND (FS.TIMEID > '" & fRng & "' )", con)


    'Execute Queries
    cmdA.ExecuteNonQuery()
    cmdB.ExecuteNonQuery()

    'Clean Up
    cmdA.Dispose()
    cmdB.Dispose()
    con.Close()
    GC.Collect()

    'Confirmation
    MessageBox.Show("Records Removed Successfully.", "Clear Complete", _
        MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
End Sub

完全に修正したわけではありませんが、近づいていると思います。cmdB.ExecuteNonQuery で「レコードが削除されました」というエラーが表示されます。tmp テーブルを作成/移入しますが、何も削除されません。

更新されたコード:

    Private Sub cmdDelete_Click(sender As System.Object, e As System.EventArgs) Handles cmdDelete.Click
    'Set/Open Connection
    Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\youngje\Documents\SQL Server Management Studio\Projects\Nwind.accdb")
    con.Open()

    'Set TIMEID
    Dim Yr, Mnth, fRng As String
    Yr = Year(Now)
    Mnth = Format(Month(Now), "00")
    fRng = Yr + Mnth + "00"

    'SELECT, to find unique IDs (PRODUCT, SHIPTO, TIMEID, DATATYPE)
    Dim cmdA As OleDbCommand = New OleDbCommand("SELECT PRODUCT, SHIPTO, TIMEID, DATATYPE INTO tmp IN 'C:\Users\youngje\Documents\SQL Server Management Studio\Projects\Nwind.accdb'" & _
                                                "FROM tblFactSales " & _
                                                "WHERE (BILLTO = 'INPUT_BILLTO') AND (BRANCHPLANT = 'INPUT_BRANCHPLANT') AND (FRTHANDLE = 'INPUT_FRTHANDLE') AND (DATATYPE = 'FORECAST') AND (TIMEID >= '" & fRng & "' )" & _
                                                "AND (SIGNEDDATA >= - .01) AND (SIGNEDDATA <= .01) AND (SALESDATA = 'short_tons')", con)

    'DELETE, joined with cmdA results
    Dim cmdB As OleDbCommand = New OleDbCommand("DELETE tblFactSales.* " & _
                                                "FROM tblFactSales INNER JOIN tmp T " & _
                                                "ON tblFactSales.PRODUCT=T.PRODUCT AND tblFactSales.SHIPTO=T.SHIPTO AND tblFactSales.TIMEID=T.TIMEID", con)

    'Execute Queries
    cmdA.ExecuteNonQuery()
    cmdB.ExecuteNonQuery()

    'Clean Up
    cmdA.Dispose()
    cmdB.Dispose()
    con.Close()
    GC.Collect()

    'Confirmation
    MessageBox.Show("Records Removed Successfully.", "Clear Complete", _
        MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)

End Sub
4

3 に答える 3

0

私はいくつかの問題を抱えていましたが、ようやく機能するようになりました。これが私が最終的に得たものです。

Private Sub cmdDelete_Click(sender As System.Object, e As System.EventArgs) Handles cmdDelete.Click

    Dim Con As SqlConnection = New SqlConnection("Server = OVP-L-R8MXE5M\SQLEXPRESS;" & "Database = dbTest;" & "Trusted_Connection=TRUE")
    Con.Open()

    Dim Yr, Mnth, fRng As String
    Yr = Year(Now)
    Mnth = Format(Month(Now), "00")
    fRng = Yr + Mnth + "00"

    Dim cmdA As SqlCommand = New SqlCommand("SELECT PRODUCT, SHIPTO, TIMEID, DATATYPE INTO tmp " & _
                                                "FROM tblFactSales " & _
                                                "WHERE (BILLTO = 'INPUT_BILLTO') AND (BRANCHPLANT = 'INPUT_BRANCHPLANT') AND (FRTHANDLE = 'INPUT_FRTHANDLE') AND (DATATYPE = 'FORECAST') AND (RPTCURRENCY = 'USD') AND (TIMEID >= '" & fRng & "') " & _
                                                "AND (SIGNEDDATA >= - .01) AND (SIGNEDDATA <= .01) AND (SALESDATA = 'short_tons')", Con)

    Dim cmdB As SqlCommand = New SqlCommand("DELETE tblFactSales " & _
                                                "FROM tblFactSales RIGHT JOIN tmp " & _
                                                "ON tblFactSales.PRODUCT=tmp.PRODUCT AND tblFactSales.SHIPTO=tmp.SHIPTO AND tblFactSales.TIMEID=tmp.TIMEID AND tblFactSales.DATATYPE=tmp.DATATYPE", Con)

    cmdA.ExecuteNonQuery()
    cmdB.ExecuteNonQuery()

    MessageBox.Show("Records Removed Successfully.", "Clear Complete", _
        MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)

End Sub
于 2012-08-07T16:17:21.427 に答える
0

私は肯定的ではありませんが、DataAdapter.Fill の関数プロトタイプを見ると、これがデータベース内のテーブルを埋めることになるとは想像できませんが、.NET で反復できるクライアント側のデータ セットになります。

クライアント側の結果セットに対して結合を実行するよりも、SQL で一時テーブルを作成する方が適切でしょうか? 多くの RDBMS がこのような機能をサポートしています。特に頭に浮かぶ方言は次のとおりです。

SELECT * INTO #tempTable FROM table;

これは結果セットを返しませんが、接続上 (おそらくデータベース システムに基づくトランザクション内) に一時テーブルを作成します。次に、一時テーブルをその接続の他のテーブルと結合して、SQL/DML ステートメント内で使用できます。

それとは別に、選択と後で実行される削除の間の目標が何であるかは完全には明らかではありません。where 句は両方のクエリで同一であるため、select と delete の間に処理またはデータ変更が実行されない場合、2 つを結合するという考えは意味がありません。結合ではなく WHERE 句を使用して DELETE ステートメントを実行するだけで、同じ目標を達成できる可能性があります。

お役に立てれば!

于 2012-07-12T18:30:22.843 に答える
0

フォーマットと読みやすさのために、SSMS を使用してクエリを作り直しました。それらをコードに再統合し、役立つかどうかを確認してください。

  INSERT  INTO tmp
        (
         PRODUCT
        ,SHIPTO
        ,TIMEID
        ,DATATYPE
        )
        SELECT  PRODUCT
               ,SHIPTO
               ,TIMEID
               ,DATATYPE
        FROM    tblFactSales
        WHERE   (BILLTO = 'INPUT_BILLTO')
                AND (BRANCHPLANT = 'INPUT_BRANCHPLANT')
                AND (FRTHANDLE = 'INPUT_FRTHANDLE')
                AND (DATATYPE = 'FORECAST')
                AND (TIMEID >= ' & fRng & ')
                AND (SIGNEDDATA >= -.01)
                AND (SIGNEDDATA <= .01)
                AND (SALESDATA = 'short_tons')

DELETE  tblFactSales
WHERE   EXISTS ( SELECT 'True'
                 FROM   tmp T
                 WHERE  tblFactSales.PRODUCT = T.PRODUCT
                        AND tblFactSales.SHIPTO = T.SHIPTO
                        AND tblFactSales.TIMEID = T.TIMEID )

なぜ tmp テーブルを使用するのか、なぜこの方法でデータを削除するのかについて、私はまだ混乱しています。ただし、これらのクエリを試してみて、役立つかどうかを確認してください。

于 2012-07-12T19:57:33.053 に答える