2009-09-16 230 views
1

我遇到過一個場景,我想將大量數據傳遞給存儲過程以生成一些動態SQL。SQL Server CLR存儲過程JSON參數

我想傳遞的數據存儲在我在ASP.NET MVC Web項目中使用的Json/C#類對象中。

[ 
{ 
    "code":"ABC123", 
    "Count": "12998", 
    "Params": 
    [ 
    {"name": "Recent", "value": "0-12m"}, 
    {"name": "Orders", "value": "1"} 
    ] 
}, 
{ 
    "code":"ABC124", 
    "Count": "13998", 
    "Params": 
    [ 
    {"name": "Recent", "value": "0-12m"}, 
    {"name": "Orders", "value": "2"} 
    ] 
}, 
{ 
    "code":"ABC125", 
    "Count": "7998", 
    "Params": 
    [ 
    {"name": "Recent", "value": "0-12m"}, 
    {"name": "Orders", "value": "3"} 
    ] 
} 
] 
..... 

然後使用該文本參數轉換回JSON對象,我用這一個動作過濾器將其轉換爲一個對象。

public class ObjectFilter : ActionFilterAttribute 
{ 

    public string Param { get; set; } 

    public Type RootType { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     if ((filterContext.HttpContext.Request.ContentType ?? string.Empty).Contains("application/json")) 
     { 

      object o = 

      new DataContractJsonSerializer(RootType).ReadObject(filterContext.HttpContext.Request.InputStream); 
      filterContext.HttpContext.Request.InputStream.Seek(0, SeekOrigin.Begin); // Rewind InputStream for other filters 

      filterContext.ActionParameters[Param] = o; 

     } 

     else 
     { 

      var xmlRoot = XElement.Load(new StreamReader(filterContext.HttpContext.Request.InputStream, 

      filterContext.HttpContext.Request.ContentEncoding)); 

      object o = new XmlSerializer(RootType).Deserialize(xmlRoot.CreateReader()); 

      filterContext.ActionParameters[Param] = o; 

     } 

    } 

}

然後用C#等在我的CLR存儲過程創建一個SQL語句,如:

UPDATE [Sample] 
SET [Field] = 
CASE 
WHEN [Recent] = "0-12m" AND [Orders] = "1" THEN "ABC123" 
WHEN [Recent] = "0-12m" AND [Orders] = "2" THEN "ABC124" 
WHEN [Recent] = "0-12m" AND [Orders] = "3" THEN "ABC125" 
... 

這是可能的,有沒有人做過這樣的事。我看過幾篇關於使用XML參數的文章,但沒有使用使用反序列化(?)json的varchar參數的文章。

+0

這可能有助於[在SQL Server中使用JSON字符串](http:// www.simple-talk.com/sql/t-sql-programming/consuming-json-strings-in-sql-server/?utm_source=simpletalk&utm_medium=email-main&utm_content=JSON-20101116&utm_campaign=SQL) – aaroned 2010-11-19 07:19:50

回答

1

我試圖用我的代碼來解析一個JSON字符串參數,但所需要的命名空間是不是在一個SQL CLR項目使用,因此我已經切換到文檔XML參數。

1

如果您自己構建不安全的裝配體,則只能使用不安全的裝配體,如DataContractJsonSerializer。另一種選擇是跳過對不安全程序集的引用和使用,並編寫自己的JSON解析代碼(或從別人那裏複製它)。