台灣最大程式設計社群網站
線上人數
1800
 
會員總數:245964
討論主題:189547
歡迎您免費加入會員
討論區列表 >> C# >> C# WINFORM 操作ACCESS SQL查詢結果後再做一次查詢
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
C# WINFORM 操作ACCESS SQL查詢結果後再做一次查詢
價值 : 50 QP  點閱數:493 回應數:16
樓主

Fresh5381
門外漢
0 4
118 11
發送站內信

各位大哥好,小的在作一個專案遇到一個問題,寫WINFORM要抓取ACCESS資料後,可以根據SQL語法查詢到的查詢表在作一次查詢嗎?
功能有點類似我手動操作ACCESS資料庫,對一個資料表建立一個SQL查詢後儲存檔案,就會有一個查詢表,我可以使用SQL查詢對這個查詢表再作一次查詢
那我WINFORM現在用OleDbCommand建立一個SQL查詢,有辦法回傳資料庫把這個查詢表直接建成資料表或查詢表嗎?

因為我查這筆資料,會得到交叉資料表,但我不知道有沒有語法可以查詢並建立交叉資料表
所以我的想法是查詢得到交叉資料表後再查詢我想要的格式再抓資料
如果可以建立查詢資料表,那可以用OleDbCommand.ExecuteNonQuery()回傳 建立交叉資料表至資料庫--再查詢交叉資料表--取得資料--刪除資料交叉查詢表

所以我想問的問題有2個
1.有辦法再winform裡面使用OleDbCommand建立一個SQL查詢,對這個查詢再作一次查詢嗎?
2.access的sql語法有辦法建立查詢交叉資料表嗎?

搜尋相關Tags的文章: [ C# ] , [ winform ] , [ access ] , [ sql ] , [ 查詢 ] ,
本篇文章發表於2020-04-11 09:16
1樓
回應

P陳
檢舉此回應
兩個答案都是可以的
1.如果讀入 DT1 後
A.只要作簡單的選取的話 可以用 dt1rows=Dt1.select ("id>'100'") 就可以從 DT1 中取得 ID>'100' 那些資料
B.可以下LINQ 的指令

2.執行 TRANSFORM Sum(D02A捐款主檔.收據次數) 的指令就可取回交叉資料表資料了
本篇文章回覆於2020-04-11 11:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

Fresh5381
檢舉此回應
抱歉 初學不太懂你的意思
1.
A.是用方法來達成嗎?
我是希望可以再用一次SQL語法作查詢
B.LINQ小的沒有接觸過實際上要怎麼使用呢?
2.我是希望能直接建一個新的資料表、查詢表,就如內文所說ACCESSSQL查詢後儲存檔案,就會有一個查詢表
本篇文章回覆於2020-04-11 16:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

P陳
檢舉此回應
這堣j部份是提供方向
1A.不知你的再查詢是什麼意思,如果只是要取得合條件資料,就可以用這招
1B.LINQ 不會用,則請上網查,網路上有教學。 <--- 初學者應該還用不到這個。

1C.可以自己寫函數來處理。 <----剛才沒有寫到這招。

2.會回一個資料表 就是回一個交叉資料表。就可以直接用了,您的問題我猜不到。
本篇文章回覆於2020-04-11 17:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

Fresh5381
檢舉此回應
抱歉 問題描述的不是很清楚
關於問題2
我的意思是如何ACCESS執行一個SQL語法就能建立交叉資料表

CREATE TABLE 訂單表
(
接單日期 date
)
我可以得到一個名稱為訂單表的資料表
但CREATE 跟TRANSFORM 如何作結合?
透過TRANSFORM查詢完資料表並建立此查詢表為一個資料表名稱為訂單表

關於1.C
意思是說有辦法OleDbCommand建立一個SQL查詢然後透過某方法建立成自定義名稱的虛擬表
然後再用某方法透過SQL查詢此虛擬表得到想要的資料

抱歉初學很多都不懂麻煩各位大大了

本篇文章回覆於2020-04-14 10:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

P陳
檢舉此回應
1.但CREATE 跟TRANSFORM 如何作結合? 不建議這樣作 <------
因為 交叉分析表算 是結果表,每次都會變化,建議直接開啟 【交叉分析表算 這個查詢】 即可
開啟這個查詢來作輸出或另作查詢 不建議產生成 資料表
硬要作的話 可以將 交叉分析表算 這個查詢的結果,用程式一筆筆寫到 ACCESS 中

2.虛擬表 <--- 在WINFORM 中就是在記憶體中的 一個 Datatable (DT1) 當然可以再用 dt1.select(條件來處理)
在 虛擬表 中的 SQL 就是 LINQ。

本篇文章回覆於2020-04-15 17:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

老頑童
捐贈 VP 給 老頑童 檢舉此回應
感覺樓主的需求只需用Sub Query(子查詢)就能達成,不用糾結在建立查詢表
例:原本需先建立以下查詢
Select * from Product where custid = 999
之後再對此查詢做另一次查詢
Select * from 查詢1 where price > 1000
那改用Sub Query只需直接用
Select * from (Select * from Product where custid = 999) where price > 1000
下一次Select command就能捉到想要的資料,事後也不用做刪除查詢表的動作
本篇文章回覆於2020-04-16 10:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

Fresh5381
檢舉此回應
了解了
#5大大
沒辦法直接開啟這個查詢
因為要開啟這個交叉資料表查詢表就要先把固定的sql語法作儲存在access裡
這樣就會把查詢日期寫死
但我需要變動的日期做查詢
所以我這個交叉資料表的sql語法會隨需求日期透過winform做變動
只能用sql語法的方式產生這個查詢表
但在winform用sql查詢又不知道有沒有沒辦法像access用手作的方式把交叉資料表儲存查詢表
不用資料表也沒關係因為只是要再作查詢
有辦法在winform用sql查詢交叉資料表並透過某方法儲存成查詢表到access嗎?

#6大大
我剛試了一下
Select * from ( TRANSFORM .......) where
子查詢裡面好像沒辦法查詢交叉資料表
本篇文章回覆於2020-04-17 14:30
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

P陳
檢舉此回應
還是找不到你的問題啊?
將日期用成變數即可作業,這沒有問題啊。
請將你的程式PO出來
本篇文章回覆於2020-04-19 06:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

Fresh5381
檢舉此回應
string strconn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + compath;
OleDbConnection odbc = new OleDbConnection(strconn);

string sql=""TRANSFORM ....";
OleDbCommand sqlCommand = new OleDbCommand(sql, con);
我現在得到這個交叉資料表
我要把這個查詢表命名成訂單表並回傳到ACCESS儲存該怎麼作?



本篇文章回覆於2020-04-20 09:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

老頑童
捐贈 VP 給 老頑童 檢舉此回應
TRANSFORM只是把SELECT命令的結果,轉換成較易觀看的排列
所有的資料,還是靠SELECT指令來取得
個人是認為,即使不使用TRANSFORM,應該也能取得你要的資料才對
方便的話,可否將你的TRANSFORM指令列出來,以及描述一下你最終想要的結果
本篇文章回覆於2020-04-20 11:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

Fresh5381
檢舉此回應
TRANSFORM Sum(訂單資料.[訂購數]) AS 訂購數之總計 SELECT 訂單資料.[商品名稱], Sum(訂單資料.[訂購數]) AS 實際出貨量, Sum(訂單資料.[訂購數]) AS 訂貨量 FROM 訂單資料 WHERE 進貨指定日 =" + "'" + day + "'" + " GROUP BY 訂單資料.[商品名稱] PIVOT 訂單資料.[客戶名稱];


商品名稱 客戶1 客戶2 客戶3
A商品 1 2 3
B商品 1 2 3
...
..

差不多可以取得上述的東西
然後我變更上述的欄位順序
商品名稱 客戶1 客戶3 客戶2
A商品 1 3 2
B商品 1 3 2
...
..

所以想在下一次SELECT指令查詢這個交叉表變更成我想要的順序
本篇文章回覆於2020-04-20 12:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

老頑童
捐贈 VP 給 老頑童 檢舉此回應
如果只是要改變順序,可以把PIVOT部份改成
PIVOT 訂單資料.[客戶名稱] in ('客戶1', '客戶3', '客戶2')

但,客戶1 客戶2 客戶3數目應該是不固定的,例如,可能會有客戶4,甚至更多
這樣要事先指定欄位順序,可能會有困難
不知你排序的規則是?
本篇文章回覆於2020-04-20 14:14
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
作者回應

Fresh5381
檢舉此回應
目前
商品名稱 實際出貨量 訂貨量 客戶1 客戶2 客戶3 客戶4

希望
商品名稱 客戶2 客戶1 客戶4 客戶3 實際出貨量 訂貨量

如果客戶數目固定的話 改成上面這樣嗎?

其實我最想是再一次Select商品名稱,客戶2,客戶1,客戶4,客戶3,實際出貨量,訂貨量 FORM 交叉資料查詢表
問題就是不知道這個交叉資料查詢表怎麼來
本篇文章回覆於2020-04-20 15:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
最有價值解答

老頑童
捐贈 VP 給 老頑童 檢舉此回應
若客戶數固定,其實也不必用到TRANSFORM,直接下SQL就能解決



或者,改變一下順序,先在TRANSFORM中的SELECT處理你要的資料後再做TRANSFORM,也許也是一條路
條條大路通羅馬
本篇文章回覆於2020-04-20 18:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
作者回應

Fresh5381
檢舉此回應
了解了,謝謝大大幫我想各種辦法
原來TRANSFORM可以分解成只用SELECT
不過大大這用法是幫我把兩次SQL合併成一次
我比較想知道有沒有辦法兩次SQL的方法
畢竟這次能合併下次又不確定能不能合併
雖然大大前面也提過子查詢,但TRANSFORM不能使用子查詢?
如果能下兩次SQL比較簡單、直觀
真的沒辦法的話就先照大大的建議做修改
以後又遇到交叉資料表的話就轉成SELECT再加上子查詢處理
謝謝大大
本篇文章回覆於2020-04-21 13:39
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.