Куда Вы помещаете SQL-операторы в свои c# проекты?

UIDevice + IOSVersion.h

@interface UIDevice (IOSVersion)

+ (BOOL)isCurrentIOSVersionEqualToVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionGreaterThanVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionGreaterThanOrEqualToVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionLessThanVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionLessThanOrEqualToVersion:(NSString *)iOSVersion

@end

UIDevice + IOSVersion.m

#import "UIDevice+IOSVersion.h"

@implementation UIDevice (IOSVersion)

+ (BOOL)isCurrentIOSVersionEqualToVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] == NSOrderedSame;
}

+ (BOOL)isCurrentIOSVersionGreaterThanVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] == NSOrderedDescending;
}

+ (BOOL)isCurrentIOSVersionGreaterThanOrEqualToVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] != NSOrderedAscending;
}

+ (BOOL)isCurrentIOSVersionLessThanVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] == NSOrderedAscending;
}

+ (BOOL)isCurrentIOSVersionLessThanOrEqualToVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] != NSOrderedDescending;
}

@end
23
задан Steve 23 February 2009 в 04:49
поделиться

7 ответов

Ну, существует много опций - таким образом, это действительно зависит от того, каковы Ваши наиболее срочные необходимости :-)

, Один подход мог бы быть должен создать SQL-операторы как текстовые файлы в Вашем решении VS и отметить их как "встроенный ресурс" в "действии сборки". Тем путем SQL включен в Ваш получающийся блок и может быть получен от него во времени выполнения с помощью ResourceManifestStream платформы.NET:

private string LoadSQLStatement(string statementName)
{
    string sqlStatement = string.Empty;

    string namespacePart = "ConsoleApplication1";
    string resourceName = namespacePart + "." + statementName;

    using(Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
    {
        if (stm != null)
        {
            sqlStatement = new StreamReader(stm).ReadToEnd();
        }
    }

    return sqlStatement;
}

необходимо заменить "ConsoleApplication1" фактическим пространством имен, в котором находятся sql файлы оператора. Необходимо сослаться на них посредством полностью определенного имени. Затем можно загрузить SQL-оператор этой строкой:

string mySQLStatement = LoadSQLStatement("MySQLStatement.sql");

Это однако делает запросы довольно "статичными", например, Вы не можете настроить и изменить их во времени выполнения - они испеклись прямо в скомпилированные биты. Но с другой стороны, в VS, у Вас есть хорошее чистое разделение между Вашим кодом программы C# и SQL-операторами.

, Если необходимо смочь возможно настроить и изменить их во времени выполнения, я поместил их в единственную таблицу SQL, которая содержит, например, ключевое слово и фактический SQL-запрос как поля. Можно затем получить их по мере необходимости и выполнить их. Так как они находятся в таблице базы данных, можно также изменить, зафиксировать, исправить их по желанию - даже во времени выполнения - не имея необходимость повторно развертывать целое приложение.

Marc

35
ответ дан marc_s 28 November 2019 в 20:47
поделиться

Когда мне действительно нужен он, я поместил запросы в отдельные *.sql файлы, затем включаю их в Resources.resx. Существует раздел 'Files' в нем, который позволяет Вам включать Встроенные Файлы ресурсов.

После этого, я могу использовать сгенерированные Ресурсы. Свойство MyQuery, который обе гарантии, что ресурс существует и сохраняет меня от записи пользовательского метода загрузки ресурса.

10
ответ дан Andrey Shchekin 28 November 2019 в 20:47
поделиться

LINQ к DataSet походит на способ пойти для Вас.

, Если Вы не использовали.NET 3.5 прежде / LINQ затем, Вы находитесь в для обработки. LINQ сохранит Вас пишущий Ваши сырые данные sql в строковых литералах и предоставит Вам более логический путь к созданию запросов.

Так или иначе, проверьте эту ссылку для использования LINQ на базах данных Access - http://msdn.microsoft.com/en-us/library/bb386977.aspx

2
ответ дан Matt Kocaj 28 November 2019 в 20:47
поделиться

Один метод, который мы использовали, должен иметь класс, который соединился бы с DB и методами к процедурам вызова, и в параметре метода Вы обеспечите имя процедуры. таким образом, весь код SQL находится в процедуре. мы использовали бы перегрузки для различных типов возврата

class ConnectToSQL()
{
        //connectSql code (read from setting file i assume)

        XMLDataDocument runProcedure(string procedureName);
        int runProcedure(string procedureName);

        //etc....
}
1
ответ дан Mike 28 November 2019 в 20:47
поделиться

Если бы я должен был создать приложение и для SQL и для Доступа, я использовал бы некоторый интерфейс IDAL, DALCommon с реализацией общей функциональности и разделил бы DALSql и DALAccess, наследованный от DALCommon, с некоторым определенным материалом, как исключения, обработка транзакций, безопасность и т.д.
, я раньше сохранял названия хранимой процедуры или запросы в файлах ресурсов.

2
ответ дан Maksym Gontar 28 November 2019 в 20:47
поделиться

Иногда, как с пользовательскими приложениями для создания отчетов, действительно необходимо охватить несоответствие импеданса и дать особое значение SQL. В этих случаях я рекомендую следующее: Для каждого модуля, который содержит строки SQL, создайте единственный статический класс "SQL" для содержания их всех. Некоторые строки SQL, вероятно, потребуют параметров, так последовательны и помещают каждую строку позади своего собственного статического метода.

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

я не вижу потребность в этих случаях для сокрытия SQL в ресурсах или в другом месте. Когда SQL важен, тогда это важно. Интересно, все больше разработчиков теперь свободно смешивает SQL с C#, включая я верю этому сайту, потому что по существу, это - каков LINQ.

Наконец, как всегда, удостоверьтесь, что Вы не восприимчивы к атакам с использованием кода на SQL. Особенно, если ввод данных пользователем включен, удостоверьтесь, что Вы используете некоторую параметризацию и что Вы не используете конкатенацию строк.

0
ответ дан Mike 28 November 2019 в 20:47
поделиться

Я скажу, куда я не буду помещать его никогда, что-то, что я видел сделанный в некотором коде, который я наследовал. Именно в Java, но относится к любому языку

  • , базовый класс А объявил защищенные статические членские переменные для для SQL-операторов, inited к пустому указателю, с получить методом, который возвращает отдельные SQL-операторы

  • А sub класс для каждого поддерживаемого сервера базы данных с init методом, который присваивает членским переменным базового класса

  • Несколько классов DA, которые используют метод базового класса получить SQL-операторы

  • , класс запуска приложения с обязанностью создать корректный подкласс возражает и называет свой init метод

, я также не войду в объяснение, почему я не буду делать этого никогда :-)

1
ответ дан Miserable Variable 28 November 2019 в 20:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: