C# и передача пользовательских типов SQL server через параметры процедуры

Искал вокруг немного теперь для этого и не имел много удачи. Вот что я пытаюсь сделать.

В основном у меня есть некоторая модель C# в виде структуры GEOJson. Таким образом, я могу создавать новые функции и featureCollections и т.д. Когда я сериализую его, он выплевывает некоторые красиво отформатированные GEOJson.

Теперь я хотел бы сохранить это в базе данных. Для этого я хотел бы просто передать всю свою «модель» (либо коллекцию функций, либо отдельную функцию…) прямо в хранимую процедуру, и процедура будет обрабатывать перемещение значений туда, куда им нужно идти. Возможно ли это сделать в SQL Server? Я немного новичок в SQL Server и в основном работал с Oracle, и я делал что-то подобное в прошлом с пользовательскими типами Oracle. Но не уверен, что SQL server может сделать то же самое.

Вот как будет выглядеть мой сериализованный JSON:

{
    "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]]]
            }
        }
    ]
}

Затем на уровне приложений я думал просто передать всю модель этого права в SQL server каким-то образом… такие как:

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;
        }

Затем я подумал, что процедура в SQL Server может просто перехватить эту переменную и проанализировать ее по мере необходимости:

SELECT @Json.feature[0].Type;

так далее.

Можно ли это сделать?

1 ответ

  1. Почему вы не используете Entity Framework?

    Вы можете сделать это, создав всю логику хранилища данных внутри хранимой процедуры, но я бы посоветовал вам не делать этого. Всегда больно писать хранимые процедуры и поддерживать. Одной из основных причин использования хранимых процедур является необходимость действительно интенсивного использования базы данных и большого объема повторяющихся операций, так как они кэшируются на сервере БД. Я не знаю, ваш ли это случай?

    Вы можете прочитать об этом здесь: http://www.seguetech.com/blog/06/04/Advantage-drawbacks-stored-procedures-processing-data