Простой конструктор операторов SQL для .Net - PullRequest
0 голосов
/ 23 января 2009

Я присоединился к текущему проекту веб-приложения .Net 2.0 для более крупной компании в качестве фрилансера. Их DAL имеет множество функций, которые вручную конструируют и выполняют операторы SQL - многие из них длинные, грязные и, как следствие, трудные для понимания и отладки. Я написал простой SQL-помощник, который позволяет мне писать такие вещи:

sqlh.addValue("name", name);
sqlh.addValue("address, address);
sqlh.addLiteral("created", "getDate()");

string sql = String.Format("INSERT INTO [Table1] ({0}) values ({1})", sqlh.getInsertFields(), sqlh.getInsertValues());

Он обрабатывает нули, а также работает для обновлений. Вот и все.

В идеале я бы использовал блок Microsoft Data Application или LINQ или что-то в этом роде, но на этом этапе серьезные архитектурные изменения невозможны. Этот метод сэкономил мне много времени, но кажется, что проблему лучше всего решить с помощью «одобренного сообществом» решения.

Существует ли популярное и легковесное решение, которое дает аналогичные результаты, от Microsoft или иным образом?

EDIT

Хотя решения SqlParameter, описанные до сих пор, являются улучшением по сравнению с чисто ручным методом построения операторов, я все же предпочитаю свое решение, когда добавление или удаление поля из запроса затрагивает только одну строку. Что-нибудь лучше? спасибо

Ответы [ 3 ]

1 голос
/ 23 января 2009

Я создал свою собственную хранимую процедуру для создания операторов вставки на основе заданной схемы таблицы, я думал, что это было довольно круто. Тогда я нашел это:

CREATE PROC sp_generate_inserts

EDIT

Я знаю, что нашел этот сценарий в результате предыдущего поста SO, но не могу найти его сейчас, если кто-то еще знает или знает, пожалуйста, отредактируйте / или добавьте в комментарий, и я отредактирую. *

1 голос
/ 23 января 2009

У вас есть несколько вариантов от Microsoft: ADO.NET или Linq2Sql являются популярными в настоящее время. Но ссылка, которую вы упомянули, потребует большого количества работы для преобразования из генерации SQL в ORM.

Чтобы сделать создание SQL более простым и безопасным, вам следует рассмотреть возможность использования параметров SQL. Вот пример:

using (SqlCommand saveCommand = DbUtil.CreateSqlCommand(context.Transaction)) {
    saveCommand.CommandText =
        "INSERT INTO Hit (" +
            "Id, PersonId, TeamId, PlayerId" +
        ") VALUES (" +
            "@Id, @PersonId, @TeamId, @PlayerId" +
        ")";

    DbUtil.AddParameter(saveCommand, "@Id", SqlDbType.UniqueIdentifier, Guid.NewGuid());
    DbUtil.AddParameter(saveCommand, "@PersonId", SqlDbType.UniqueIdentifier, hit.PersonId);
    DbUtil.AddParameter(saveCommand, "@TeamId", SqlDbType.UniqueIdentifier, hit.TeamId);
    DbUtil.AddParameter(saveCommand, "@PlayerId", SqlDbType.UniqueIdentifier, hit.PlayerId);

    saveCommand.ExecuteNonQuery();
}

Это отделит ваш список параметров от SQL. Также SQL мы будем гораздо более разборчивым. DbUtil в этом примере - это просто вспомогательная функция, которую я написал для создания моей команды sql из соединения или транзакции. Также как и в вашем sqlh.addValue, у меня есть DbUtil.AddParameter, который работает, принимая команду, имя переменной, тип данных и значение. Вот пример, включающий перегруженные методы:

internal static SqlParameter CreateSqlParameter(
    string parameterName,
    SqlDbType dbType,
    ParameterDirection direction,
    object value
) {
    SqlParameter parameter = new SqlParameter(parameterName, dbType);

    if (value == null) {
        value = DBNull.Value;
    }

    parameter.Value = value;
    parameter.Direction = direction;
    return parameter;
}

internal static SqlParameter AddParameter(
    SqlCommand sqlCommand,
    string parameterName,
    SqlDbType dbType
) {
    return AddParameter(sqlCommand, parameterName, dbType, null);
}

internal static SqlParameter AddParameter(
    SqlCommand sqlCommand,
    string parameterName,
    SqlDbType dbType,
    object value
) {
    return AddParameter(sqlCommand, parameterName, dbType, ParameterDirection.Input, value);
}

internal static SqlParameter AddParameter(
    SqlCommand sqlCommand,
    string parameterName,
    SqlDbType dbType,
    ParameterDirection direction,
    object value
) {
    SqlParameter parameter = CreateSqlParameter(parameterName, dbType, direction, value);
    sqlCommand.Parameters.Add(parameter);
    return parameter;
}

internal static SqlParameter AddParameter(
    SqlCommand sqlCommand,
    string parameterName,
    SqlDbType dbType,
    ParameterDirection direction
) {
    SqlParameter parameter = CreateSqlParameter(parameterName, dbType, direction, null);
    sqlCommand.Parameters.Add(parameter);
    return parameter;
}
0 голосов
/ 23 января 2009

Объекты SqLCommand и SQLParameter могут быть вам полезны:

  Dim sc As New SqlClient.SqlCommand

  Dim sp As New SqlClient.SqlParameter("@value", SqlDbType.VarChar)
  sp.Value = "test"

  sc.Parameters.Add(sp)
  sc.CommandText = "select column1, column2 from table where column3=@value"

  sc.ExecuteReader()

Это vb.net, но вы поняли идею. Это поможет предотвратить внедрение SQL, выглядит аккуратно и читабельно.

Не забудьте настроить строку подключения и т. Д.

...