![](/img/trans.png)
[英]C# - What are Some High Performance Best Practices/Tips for ADO.NET
[英]What are the best practices on formatting inline sql using ADO.NET in C#
我知道這里有很多關於內聯sql與存儲過程的問題......我不想再開始這樣的了! 這個是關於內聯(或動態)sql。
我也知道這一點對Linq to SQL及其后續實體框架或多或少都沒有意義。
但是...... 假設您選擇(或者您的上司要求)使用普通的舊ADO.NET和內聯(或動態)sql 。 那么這個和格式化sql的最佳實踐是什么?
我現在做的是:我喜歡先在存儲過程中創建我的SQL語句。 這為我提供了SQL Server Management Studio中的語法着色,並且能夠輕松地測試查詢,而無需通過我正在開發的應用程序在代碼中執行它。
所以只要我正在實現/調試,我的代碼看起來像這樣:
using (SqlConnection conn = new SqlConnection("myDbConnectionString"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "myStoredProcName";
// add parameters here
using (SqlDataReader rd = cmd.ExecuteReader())
{
// read data and fill object graph
}
}
}
一旦調試和測試階段完成,我就像這樣更改上面的代碼:
using (SqlConnection conn = new SqlConnection("myDbConnectionString"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = GetQuery();
// add parameters here
using (SqlDataReader rd = cmd.ExecuteReader())
{
// read data and fill object graph
}
}
}
我添加了一個額外的私有方法,例如GetQuery()
,其中我復制/粘貼存儲過程的整個塊,如下所示:
private string GetQuery()
{
return @"
SET NOCOUNT ON;
SELECT col1, col2 from tableX where id = @id
-- more sql here
";
}
像這樣工作的好處是,如果我以后必須調試/更新sql代碼,我可以輕松地還原代碼再次調用存儲過程,一旦完成,我可以輕松地將sql代碼重新復制/粘貼, 而無需在每一行和類似的東西周圍加上引號 。
在查詢中包含換行符是一種好習慣嗎?
還有其他我沒想過的東西或技巧可以使這種方法更好嗎?
你們是怎么做這樣的事情的?
或者我是唯一仍然使用(必須使用)內聯sql的人?
內聯(使用或不使用文字@"..."
語法)適用於短查詢...但是對於任何更長的內容,請考慮將tsql作為項目中的文件; 要么是嵌入式資源/ resx,要么是平面文件。 當然,在那個階段,無論如何你應該把它變成一個存儲過程;-p
但是將它作為一個單獨的文件強制進行相同的分離,這將使以后變成存儲過程變得輕而易舉(可能只是添加了CREATE PROC
等)。
內聯的一個問題 - 它使某些人很容易連接用戶輸入......這顯然很糟糕(你在示例中正確使用了參數)。
我以前使用過.NET資源文件。 這些對於保存特定代碼庫中使用的所有查詢的庫非常方便,特別是當同一個查詢可能在多個地方使用時(是的,我意識到這也表明一些糟糕的設計,但有時你需要在給出的框內工作)給你)。
除了非繁瑣的單行SQL語句之外,我總是利用多行並使其成為const
const string SelectMyTable = @"
SELECT column_one
, column_two
, column_three
FROM my_table
";
這一切都允許我剪切並粘貼到SQL管理器進行測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.