2010-11-12 68 views
1

我正在爲我的應用程序製作一個SQL腳本編輯器/執行程序組件,它與SQL Server Management Studio或舊查詢分析器非常相似。我正在使用C#,.NET Framework 3.5 SP1。我的問題是,我希望組件解析SQL以確定它是否應使用SqlCommand.ExecuteNonQuery(),SqlCommand.ExecuteScalar()或SqlDataAdapter.Fill(dataTable)來運行該腳本。其目的是允許用戶執行非查詢,但也返回結果集供用戶查看,就像SSMS /查詢分析器所做的一樣,但也隱藏了ADO.NET實現細節。解析T-SQL語句

我通常會默認爲SqlDataAdapter.Fill(dataTable),並且總是返回DataTable供用戶查看。這仍然會像ExecuteNonQuery那樣運行非查詢,但是它具有使用較慢的SqlDataAdapter類來運行的開銷。這在許多非查詢情況下不是最佳的。我會採用的方法是允許用戶選擇結果類型'表'(它將運行SqlDataAdapter.Fill(...),'Value'(它將運行ExecuteScalar)或' None'(它將運行ExecuteNonQuery)但我不希望它們暴露於ADO.NET實現細節,我希望它們只需在文本框中鍵入SQL腳本,點擊Execute按鈕,程序將會運行該腳本並返回一個數據網格中的結果集(如果有的話)

所以...我需要組件能夠在執行它之前解析SQL,以辨別是否會有結果集運行劇本與否

+0

當談到這樣的事情時,我通常會問自己:「我將如何人爲地決定使用哪一個?」問問自己,你們什麼時候使用每一種?從那裏你會知道如何讓應用程序決定;你基本上爲此寫了一個AI。據我所知,除非您預先知道數據太大或者只是一個單一值,否則很難分辨使用哪一個,除非應用程序實際執行語句,否則應用程序將不知道該數據。 – BeemerGuy 2010-11-12 00:15:57

+0

而且,由於您基本上正在編寫一個AI,因此您需要擔心它會變得自我意識,並決定它知道哪些查詢您的用戶應該比他們運行得更好。 :) – 2010-11-12 00:24:05

回答

6

喲不解析文本,罪如果客戶沒有必要的信息來確定請求是否會返回結果。請採取如execute usp_anonymousProcedure 1,2;的請求,你能告訴它是否返回結果嗎?很明顯不是。所以,你發送請求到服務器,並要求它只是return the metadata about the result

SET FMTONLY ON; 

只返回元數據到客戶端。 可以用於測試 響應的格式,而無需實際運行 查詢。

您設置此項,運行請求在服務器上的請求,然後您將知道請求返回的結果的形狀。

1

爲什麼不使用ExecuteReader執行SQL?

IDataReader將包含零個或多個結果集。

您可以遍歷結果集,並使用DataTable.Load(IDataReader)將每個結果集加載到DataTable中 - 或者僅使用IDataReader/IDataRecord成員來獲取列名稱和數據。

我不明白事先知道結果集的形狀會帶來什麼好處,而且我非常確定像查詢分析器這樣的現有腳本執行程序不會執行此操作。