2016-05-28 1 views
0

Sie haben jetzt schon ein wenig gesucht und hatten nicht viel Glück. Also hier ist was ich versuche zu tun.C# und die Übergabe benutzerdefinierter Typen an den SQL-Server über Prozedurparameter

Grundsätzlich habe ich ein C# -Modell in Form einer GEOJson-Struktur. So kann ich neue Features und featureCollections usw. erstellen. Wenn ich es serialisiere, spuckt es einige schön formatierte GEOJson aus.

Jetzt möchte ich dies in der Datenbank beibehalten. Um dies zu tun, möchte ich einfach mein gesamtes "Modell" (entweder eine FeatureCollection oder ein einzelnes Feature ...) direkt in die gespeicherte Prozedur übertragen, und die Prozedur kann die Werte dorthin verschieben, wo sie hingehören. Ist es möglich, dies in SQL Server zu tun? Ich bin etwas neu bei SQL Server und habe hauptsächlich mit Oracle gearbeitet, und ich habe in der Vergangenheit mit den benutzerdefinierten Typen von Oracle so etwas gemacht. Aber nicht sicher, ob SQL Server eine ähnliche Sache machen kann. Hier

ist, was meine JSON aussehen würde serialisiert:

{ 
    "type" : "FeatureCollection", 
    "features" : [{ 
      "Type" : "Feature", 
      "Properties" : { 
       "name" : null, 
       "description" : "Some Site Boundaries", 
       "featureId" : 12, 
       "featureTypeCode" : "siteboundary", 
       "locationHierarchy" : { 
        "city" : { 
         "shortName" : "Long Beach", 
         "longName" : "Long Beach", 
         "hierarchyId" : 7, 
         "hierarchyParentId" : 4 
        }, 
        "state" : { 
         "shortName" : "CA", 
         "longName" : "California", 
         "hierarchyId" : 4, 
         "hierarchyParentId" : 3 
        }, 
        "country" : { 
         "shortName" : "U.S.A", 
         "longName" : "United States of America", 
         "hierarchyId" : 3, 
         "hierarchyParentId" : 2 
        } 
       }, 
       "floors" : [] 
      }, 
      "Geometry" : { 
       "type" : "Polygon", 
       "coordinates" : [[[-118.1400864, 33.8324338], [-118.1401331, 33.8148000], [-118.1675695, 33.8148116], [-118.1677493, 33.8324253], [-118.1400864, 33.8324338]]] 
      } 
     }, { 
      "Type" : "Feature", 
      "Properties" : { 
       "name" : null, 
       "description" : "Some place", 
       "featureId" : 71, 
       "featureTypeCode" : "siteboundary", 
       "locationHierarchy" : { 
        "city" : { 
         "shortName" : "St Louis", 
         "longName" : "St Louis", 
         "hierarchyId" : 8, 
         "hierarchyParentId" : 6 
        }, 
        "state" : { 
         "shortName" : "MO", 
         "longName" : "Missouri", 
         "hierarchyId" : 6, 
         "hierarchyParentId" : 3 
        }, 
        "country" : { 
         "shortName" : "U.S.A", 
         "longName" : "United States of America", 
         "hierarchyId" : 3, 
         "hierarchyParentId" : 2 
        } 
       }, 
       "floors" : [] 
      }, 
      "Geometry" : { 
       "type" : "Polygon", 
       "coordinates" : [[[-90.3590381, 38.7637456], [-90.3390834, 38.7637456], [-90.3390834, 38.7474431], [-90.3590381, 38.7474431], [-90.3590381, 38.7637456]]] 
      } 
     }, { 
      "Type" : "Feature", 
      "Properties" : { 
       "name" : null, 
       "description" : null, 
       "featureId" : 140, 
       "featureTypeCode" : "siteboundary", 
       "locationHierarchy" : { 
        "city" : { 
         "shortName" : "Mesa", 
         "longName" : "Mesa", 
         "hierarchyId" : 9, 
         "hierarchyParentId" : 5 
        }, 
        "state" : { 
         "shortName" : "AZ", 
         "longName" : "Arizona", 
         "hierarchyId" : 5, 
         "hierarchyParentId" : 3 
        }, 
        "country" : { 
         "shortName" : "U.S.A", 
         "longName" : "United States of America", 
         "hierarchyId" : 3, 
         "hierarchyParentId" : 2 
        } 
       }, 
       "floors" : [] 
      }, 
      "Geometry" : { 
       "type" : "Polygon", 
       "coordinates" : [[[-111.7369067, 33.4783391], [-111.7368442, 33.4653505], [-111.7170835, 33.4653505], [-111.7170835, 33.4782348], [-111.7369067, 33.4783391]]] 
      } 
     } 
    ] 
} 

Dann wird in der Anwendungsschicht ich dachte war, einfach das gesamte Modell dieses Recht in SQL Server in irgendeiner Weise passieren ... wie :

public int CreateFeature(Feature json) 
     { 
      string result = string.Empty; 
      int row; 
      using (SqlConnection conn = new SqlConnection(_smmConnectionString)) 
      using (SqlCommand cmd = new SqlCommand("dbo.CreateFeature", conn)) 
      { 
       cmd.CommandType = CommandType.StoredProcedure; 

       // set up the parameters 
       //cmd.Parameters.Add("@parm1in", SqlDbType.VarChar, 7); 
       cmd.Parameters.Add("@Json", SqlDbType.Structured); 

       // set parameter values 
       cmd.Parameters["@Json"].Value = json; 

       conn.Open(); 
       row = cmd.ExecuteNonQuery(); 
       conn.Close(); 
      } 
      return row; 
     } 

durch Dann dachte ich, das Verfahren in SQL Server einfach diese Variable fangen und zu analysieren, wie gebraucht:

SELECT @Json.feature[0].Type; 

usw. .....

Ist das möglich?

+0

Welche Version von SQL Server Sie verwenden? Ab 2016 wird es eine systemeigene JSON-Unterstützung in SQL Server geben (bis zu einem gewissen Grad). Ich glaube, es ist möglich, bis zum Veröffentlichungsdatum etwas CTP zu finden und damit zu spielen. –

+0

Ja, ich habe das gelesen ... OPENJSON Ich glaube. Läuft aber 2016 nicht, so dass diese Option aus ist. Ich denke, anstatt dumpfe Stunden damit zu verbringen, dieses herauszufinden, werde ich es einfach auf die Art und Weise des armen Mannes tun und Verfahren mit den notwendigen Parametern erstellen, wobei jedes nach Bedarf verwendet wird. Um ehrlich zu sein, gibt es nicht "das" viele .. Ich wollte nur einen glatten Weg haben, dies zu tun und etwas Neues zu lernen :) – dvsoukup

Antwort

0

Warum verwenden Sie kein Entity Framework?

Sie können dies tun, indem Sie die gesamte Datenspeicherlogik in einer gespeicherten Prozedur erstellen, aber ich würde vorschlagen, dass Sie dies nicht tun. Es ist immer schmerzhaft, gespeicherte Prozeduren zu schreiben und zu pflegen. Einer der Hauptgründe für die Verwendung gespeicherter Prozeduren ist die Notwendigkeit einer wirklich intensiven Datenbanknutzung und einer hohen Anzahl sich wiederholender Operationen, da diese im DB-Server zwischengespeichert werden. Ich weiß nicht, ob das dein Fall ist?

Sie können hier darüber lesen: http://www.seguetech.com/blog/06/04/Advantage-drawbacks-stored-procedures-processing-data

+0

Kein Fan von EF – dvsoukup

Verwandte Themen