2009-12-04 41 views
8

Tôi có rất nhiều tệp XSL trong ứng dụng web ASP.NET của mình. Rất nhiều. Tôi tạo ra một loạt các phản hồi HTML AJAX bằng cách sử dụng loại phương pháp biến đổi chung này:Lưu trữ XSLT trong SQL Server 2005 với loại xml?

public void Transform(XmlDocument xml, string xslPath) 
{ 
    ... 
    XslTransform myXslTrans = new XslTransform(); 
    myXslTrans.Load(xslPath); 
    myXslTrans.Transform(xml,null, HttpContext.Current.Response.Output);   
} 

Tôi muốn di chuyển các định nghĩa XSL vào SQL Server, sử dụng cột loại xml. Tôi sẽ lưu trữ toàn bộ tệp XSL trong một hàng trong SQL và mỗi XSL là tự chứa (không có nhập). Tôi sẽ đọc ra định nghĩa XSL từ SQL vào đối tượng XslTransform của tôi.

Something như thế này:

public void Transform(XmlDocument xml, string xslKey) 
{ 
    ... 

    SqlCommand cmd = new SqlCommand("GetXslDefinition"); 
    cmd.AddParameter("@xslKey", SqlDbType.VarChar).Value = xslKey; 
    // where the result set has a single column of XSL: "<xslt:stylesheet>..." 
    ... 

    SqlDataReader dr = cmd.ExecuteReader(); 
    if(dr.Read()) { 
     SqlXml xsl = dr.GetSqlXml(0); 
     XslTransform myXslTrans = new XslTransform(); 
     myXslTrans.Load(xsl.CreateReader()); 
     myXslTrans.Transform(xml,null, HttpContext.Current.Response.Output);  
    } 
} 

Nó có vẻ như là một cách đơn giản để:

  • add metadata cho mỗi XSL, như lastUsed, useCount vv
  • số lượng lớn khả năng cập nhật/tìm kiếm
  • ngăn chặn nhiều truy cập đĩa
  • tránh tham chiếu đường dẫn tương đối và organizin g file
  • cho phép thay đổi XSL mà không redeploying (Tôi thậm chí có thể viết một trang admin mà chọn/cập nhật các XSL trong cơ sở dữ liệu)

Có ai đã thử này trước đây chưa? Có bất kỳ cảnh báo nào không?

EDIT

Hãy cẩn thận rằng phản ứng đã liệt kê:

  • truy cập đĩa không được bảo đảm để làm giảm
  • này sẽ phá vỡ xsl: bao gồm

Trả lời

3

Hai vấn đề lớn Tôi có thể thấy là:

  1. Chúng tôi sử dụng rất nhiều bao gồm để đảm bảo rằng chúng tôi chỉ làm những việc một lần, lưu trữ XSLT trong cơ sở dữ liệu sẽ ngăn chúng tôi làm điều đó.
  2. Điều này làm cho việc cập nhật XSL thú vị hơn - chúng tôi rất vui khi kết xuất các tệp .xsl mới vào các trang web được triển khai mà không cần cập nhật đầy đủ trang web. Đối với vấn đề đó, chúng tôi có bit mã tìm kiếm xsl cụ thể của khách hàng trong một thư mục và các bit mã đó có thể quay lại mã phổ biến (mẫu) trong thư mục gốc - vì vậy tôi không chắc chắn về điều redeploy ở tất cả , nhưng điều này sẽ phụ thuộc rất nhiều vào trường hợp sử dụng cụ thể, của bạn chắc chắn khác với chúng tôi.

Về mặt truy cập đĩa, hmm ... db vẫn phải truy cập vào đĩa để lấy dữ liệu và nếu bạn đang nói về bộ nhớ đệm thì db không phải là yêu cầu cho phép lưu bộ nhớ đệm.

Phải đồng ý về các tùy chọn cập nhật/tìm kiếm - bạn có thể làm việc với Powershell nhưng cần phải chạy trên máy chủ và đó không phải lúc nào cũng là ý tưởng hay.

Về mặt kỹ thuật, tôi không thể thấy lý do tại sao không (ngoại trừ mong muốn bao gồm như trên) nhưng thực tế nó có vẻ khá cân bằng với các đối số tốt.

3

Tôi lưu trữ XSLT trong cơ sở dữ liệu trong ứng dụng của tôi dbscript. (Tuy nhiên tôi giữ chúng trong một cột NVARCHAR, vì nó cũng chạy trên SQL Server 2000)

Vì người dùng có thể chỉnh sửa XSLT của họ, tôi cần phải viết trình xác thực tùy chỉnh tải văn bản của TextBox trong .Net XslCompiledTransform đối tượng như thế này:

args.IsValid = true; 

    if (args.Value.Trim() == "") 
     return; 

    try 
    { 
     System.IO.TextReader rd = new System.IO.StringReader(args.Value); 
     System.Xml.XmlReader xrd = System.Xml.XmlReader.Create(rd); 
     System.Xml.Xsl.XslCompiledTransform xslt = new System.Xml.Xsl.XslCompiledTransform(); 
     System.Xml.Xsl.XsltSettings xslts = new System.Xml.Xsl.XsltSettings(false, false); 
     xslt.Load(xrd, xslts, new System.Xml.XmlUrlResolver()); 
     xrd.Close(); 
    } 
    catch (Exception ex) 
    { 
     this.ErrorMessage = (string.IsNullOrEmpty(sErrorMessage) ? "" : (sErrorMessage + "<br/>") + 
      ex.Message); 
     if (ex.InnerException != null) 
     { 
      ex = ex.InnerException; 
      this.ErrorMessage += "<br />" + ex.Message; 
     } 
     args.IsValid = false; 
    } 

đối với số điểm của bạn:

  • tập tin I/O sẽ được thay thế bằng đĩa cơ sở dữ liệu được tạo ra I/O, vì vậy không có lợi nhuận có

  • thay đổi triển khai để cung cấp tập lệnh INSERT/UPDATE chứa dữ liệu mới

+0

Cảm ơn! Ví dụ tốt về xác thực XSLT. Về mặt hiệu suất, bạn có thực sự trải qua sự gia tăng của đĩa I/O không? Tôi cần phải làm một số thử nghiệm, nhưng tôi đã theo ấn tượng rằng SQL Server có thể sử dụng một bộ nhớ cache dữ liệu trong bộ nhớ đáng kể. –

Các vấn đề liên quan