iT邦幫忙

0

SQL Connection 是否可以重複使用

  • 分享至 

  • xImage

您好:
要用CONSOLE 來批次 產生EXCEL,但因為裡面有類似子查詢得的需求
比如 select * from A where aa=1 , 這一個會需要產稱一個sheet

而 上一個語法,會需要再分別撈出
select * from B where xx=1 -->SHEET2
select * from C where xx=1 -->SHEET3

這樣,以下語法,是否能重複使用同一個connection 來做SalDataAdapter

 SqlConnection connection = new SqlConnection();
            connection.ConnectionString = con_str;


            */
            //-----1.先抓取要 執行的資料
            SqlCommand command = new SqlCommand();
            command.CommandText = @"  XX ";



            using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command.CommandText, connection))
            {
                DataTable dt = new DataTable();
                dataAdapter.Fill(dt);

					IWorkbook workBook;
                    ISheet sheet;

                if (dt.Rows.Count > 0){
						
						---> 
						setEXCEL( connection , 其他參數  );
						
						
				}

            }   
			
//--------------------------------------

            setEXCEL( SqlConnection connection , 其他參數  ){
				再重新撈出 與法填到 sheet
				using (SqlDataAdapter dataAdapter2 = new SqlDataAdapter(command.CommandText, connection)){
				
				}//--
			
			}  			

======================================重新釐清一下 自己想的架構
1.我要用排程來批次產生XLSX ,並寄出
2.所以同一個時間,會撈出多筆資料, 產生多個XLSX ,並寄出 ==>MASTER

2-1.於此同時,若(2)我會在COUNT 明細資料,MASTER 一筆資料有關聯多筆DATIAL
則,會再跑回圈,將DETAIL 產生多個SHEET,加到原來MASTER 的XLSX內

故,想說,在我這次 執行排程時,只有一個CONNECTION
這一個CONNECTION ,可以供 MASTER 及 DETAIL 多次使用

因為我將 要撈資料的 設定值到XLSX的動作,想做在一個FUNCTION 內,重複使用
相對的,connection 也重複使用
謝謝

froce iT邦大師 1 級 ‧ 2023-06-05 15:38:17 檢舉
你這不能用CTE還是temp table來處理嗎?
noway iT邦研究生 3 級 ‧ 2023-06-05 17:15:41 檢舉
您好:
您說的 CTE 或 temp table,應該是在SQL 那邊的語法
但目前,是要將這些資料,分別匯出到 同一個 xlsx 的不同sheet
謝謝
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
天黑
iT邦研究生 5 級 ‧ 2023-06-05 16:14:27

如果你是想用一次SqlConnection執行多次sql語法撈取可以參考這個,上面的問題描述我看不出有沒有相依XD

noway iT邦研究生 3 級 ‧ 2023-06-05 17:30:38 檢舉

您好:
我有重新在描述一下,在麻煩您看一下

順便請教,
using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command.CommandText, connection))

他應該是 結尾,自動關閉dataAdapter ,而不是 connection 吧!
謝謝

天黑 iT邦研究生 5 級 ‧ 2023-06-06 09:03:34 檢舉

如果是你上面貼的做法我沒有看到關閉連線的功能喔,第二個你的描述master跟detail的話通常應該是用left join處理,第三個就是資料撈取時就單獨做好這件事情,最後在寫入資料到excel sheet,在連線資料庫時寫資料你會卡著連線,報表如果30分鐘出來,連線就卡30分鐘...上面的連結有很多寫法可以參考看看

0
alien663
iT邦研究生 5 級 ‧ 2023-06-06 09:40:09

我會覺得沒有必要這麼複雜,單純地將資料撈出,然後直接將資料轉成檔案出來就好,是不是用同一個SQL Connection單純就是看你撈資料的設計,你想要都用同一個SQL Connection當然沒有問題,這反而是比較不需要特別問的問題。
例如 :

SqlConnection connection = new SqlConnection();
connection.ConnectionString = con_str;
DataSet ds = new DataSet();
for(int i;i<n;i++)
{
    // ds.Add(GetDataTable("My SQL Code"))
}
ExcelComponent MyExcel = new();
MyExcel.Export(ds);

我的匯出Excel Component(實際使用可以回到上一層看TestProject)我的Github

https://ithelp.ithome.com.tw/upload/images/20230606/20153982yNpnXnijcW.jpg

看更多先前的回應...收起先前的回應...
noway iT邦研究生 3 級 ‧ 2023-06-06 17:37:58 檢舉

您好:
ds.Add(GetDataTable("My SQL Code"))
這一段
我塞多筆SQL 進去
他只能 用ds[0] 來找 嗎?

謝謝

alien663 iT邦研究生 5 級 ‧ 2023-06-07 08:31:01 檢舉

聽不太懂你在問什麼,DataSet可以存多個DataTable,我在自己的Component裡面會自動幫你把DataSet裡面的多個DataTable轉成同一個Excel的多個Sheet。
範例程式碼只是告訴你,同一個Connection要多個查詢只是很簡單的問題,如果你今天有三段SQL要處理,可以不要用For迴圈,直接寫三段SQL把資料各自撈到DataSet裡面阿。

用ds[0]來找?這句話我完全不懂你的意思。

noway iT邦研究生 3 級 ‧ 2023-06-11 14:21:04 檢舉

您好:
不好意思,沒有說清楚
比如我今天有三個排程,他會同一時間撈出來

for(int i;i<n;i++)
{
// ds.Add(GetDataTable("My SQL Code"))
}

---排程1 有2段語法
select '排程1-1' -->填到MA
select '排程1-2' -->填到Sheet2

---排程2 有1段語法
select '排程2-1' -->填到MA

---排程3 有3段語法
select '排程3-1' -->填到MA
select '排程3-2' -->填到Sheet2
select '排程3-2' -->填到Sheet3

因為每一段排程,我會產生不同的檔案,用不同的標題,寄給 不同的人

所以會需要 分出 排程1,2,3 的 資料
及不同sheet NAME

所以我就算 前面有排序
101 '排程1-1'
102 '排程1-2'
201 '排程2-1'
301 '排程3-1'
302 '排程3-2'
303 '排程3-2'

但在DATASET 內似乎,無法直接對應 101 '排程1-1' 等

謝謝

alien663 iT邦研究生 5 級 ‧ 2023-06-12 08:30:56 檢舉

DataSet中,可以為各個DataTable去設定TableName,我的寫的Library就是依據TableName自動產生Sheet Name的。
可以參考一下我的寫法,我記得在TestProject裡面我有弄一個"haha"的範例。

我要發表回答

立即登入回答