簡體   English   中英

在C#中使用ADO.NET格式化內聯sql的最佳實踐是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM