[英]How to query DB, and Join results with second query (VB.NET)
我是VB.NET的新手,我希望這是一個簡單的問題。 我正在嘗試查詢數據庫,將結果存儲到數據集,然后查詢同一數據庫,並為刪除任務加入結果。 如果有人有時間可以幫助,這就是我到目前為止的情況。 提前致謝。 也; 我更喜歡了解自己做錯了什么,而不是只是告訴我如何解決。
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
我不是很肯定,但是在查看DataAdapter.Fill的函數原型時,我無法想象這會填滿數據庫中的表,而是可以在.NET中進行迭代的客戶端數據集。
與其嘗試對客戶端結果集執行聯接,不如使用SQL創建臨時表是否合適? 許多RDBMS都支持這種功能。 特別是想到的方言是:
SELECT * INTO #tempTable FROM table;
這不會返回結果集,而是在連接上填充臨時表(可能在基於數據庫系統的事務中)。 然后可以將臨時表與該連接的其他表聯接,並在SQL / DML語句中使用。
除此之外,還不清楚在選擇和隨后執行的刪除之間的目標是什么。 這兩個查詢中的where子句相同,因此,如果在選擇刪除操作之間未執行任何處理或數據更改,則將兩者結合在一起的想法是不必要的。 可能您可以僅使用WHERE子句而不是聯接執行DELETE語句,並實現相同的目標。
希望這可以幫助!
我已經使用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表或為什么要以這種方式刪除數據感到困惑。 但是試一下這些查詢,看看它們是否有幫助。
我有幾處錯了,但是我終於開始工作了。 這就是我最終得到的。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.