. NET Базовое приложение с SQL Серверная база данных, в которой имена таблиц имеют префикс C# - Dynami c Имя таблицы - PullRequest
0 голосов
/ 14 марта 2020

Мне интересно, возможно ли и хорошая практика сохранять префикс таблицы в файле конфигурации и использовать его в каждом запросе SqlCommand, добавляя его к реальному имени таблицы, чтобы два приложения с одинаковой структурой таблицы могли использовать одну и ту же базу данных без обмен данными.

На данный момент все мои SqlCommand запросы выглядят так:

using (var connection = new SqlConnection(connString))
{
    using (SqlCommand sqlCmd = new SqlCommand("SELECT * from SomeTable", connection))
    {
        connection.Open();

        using (SqlDataReader dr = sqlCmd.ExecuteReader())
        {
            if (dr.HasRows)
            {
                while (dr.Read())
                {
                    Model _record = new Model();
                    _record.ID = Convert.ToInt32(dr["ID"]);
                    _record.Value = Convert.ToString(dr["Value"]);

                    RecordsList.Add(_record);
                }
            }
        }

        connection.Close();

        return RecordsList;
    }
}

Или:

using (var connection = new SqlConnection(connString))
{
    using (SqlCommand sqlCmd = new SqlCommand("UPDATE SomeTable SET Value = @Value " +
                                              "WHERE ID = @Id;", connection))
    {
        sqlCmd.Parameters.Add("@Value", System.Data.SqlDbType.NVarChar).Value = _record.Value;
        sqlCmd.Parameters.Add("@Id", System.Data.SqlDbType.Int).Value = _record.Id;

        connection.Open();
        sqlCmd.ExecuteNonQuery();
        connection.Close();
    }
}

Как видите, я использую параметров, но невозможно использовать параметры в имени таблицы.

Какой должен быть подход для защиты запроса от внедрения SQL, если я хочу добавить prefix_ в начало имени таблицы, чтобы приложение обращалось к таблице с префиксом, сохраненным в файле настроек?

Ответы [ 2 ]

2 голосов
/ 14 марта 2020

Вот простая служебная функция для переноса имени таблицы в разделители и предотвращения SQL инъекций. Это C# реализация функции T SQL QUOTENAME :

    private static string QuoteName(string identifier)
    {
        var sb = new StringBuilder(identifier.Length + 3, 1024);
        sb.Append('[');
        foreach (var c in identifier)
        {
            if (c == ']')
                sb.Append(']');
            sb.Append(c);
        }
        sb.Append(']');
        return sb.ToString();
    }

И вы бы использовали ее так:

var sql = $"UPDATE {QuoteName(SomePrefix + "_" + SomeTable)} SET Value = @Value WHERE ID = @Id;"
0 голосов
/ 14 марта 2020

Простые ответы: возможно ли это? Да. Это хорошая идея? Не в подавляющем большинстве случаев.

Если вы рассматриваете этот вид уловки, то это предполагает, что уместной будет общая стратегия проектирования. Существуют такие понятия, как схема владельца и многопользовательский дизайн, которые являются общими и хорошо документированными и которые обеспечивают гораздо более чистый и поддерживаемый платформой подход к разделению хранилищ данных.

Такие хитрости, как идея с префиксами, почти всегда приводят к катастрофе c проблем в течение срока службы приложения, если не достигнуто элитного уровня проектирования инфраструктуры. Даже тогда, некоторые из лучших реализованных проектов часто имеют свои проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...