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
Ну, существует много опций - таким образом, это действительно зависит от того, каковы Ваши наиболее срочные необходимости :-)
, Один подход мог бы быть должен создать 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
Когда мне действительно нужен он, я поместил запросы в отдельные *.sql файлы, затем включаю их в Resources.resx. Существует раздел 'Files' в нем, который позволяет Вам включать Встроенные Файлы ресурсов.
После этого, я могу использовать сгенерированные Ресурсы. Свойство MyQuery, который обе гарантии, что ресурс существует и сохраняет меня от записи пользовательского метода загрузки ресурса.
LINQ к DataSet походит на способ пойти для Вас.
, Если Вы не использовали.NET 3.5 прежде / LINQ затем, Вы находитесь в для обработки. LINQ сохранит Вас пишущий Ваши сырые данные sql в строковых литералах и предоставит Вам более логический путь к созданию запросов.
Так или иначе, проверьте эту ссылку для использования LINQ на базах данных Access - http://msdn.microsoft.com/en-us/library/bb386977.aspx
Один метод, который мы использовали, должен иметь класс, который соединился бы с DB и методами к процедурам вызова, и в параметре метода Вы обеспечите имя процедуры. таким образом, весь код SQL находится в процедуре. мы использовали бы перегрузки для различных типов возврата
class ConnectToSQL()
{
//connectSql code (read from setting file i assume)
XMLDataDocument runProcedure(string procedureName);
int runProcedure(string procedureName);
//etc....
}
Если бы я должен был создать приложение и для SQL и для Доступа, я использовал бы некоторый интерфейс IDAL, DALCommon с реализацией общей функциональности и разделил бы DALSql и DALAccess, наследованный от DALCommon, с некоторым определенным материалом, как исключения, обработка транзакций, безопасность и т.д.
, я раньше сохранял названия хранимой процедуры или запросы в файлах ресурсов.
Иногда, как с пользовательскими приложениями для создания отчетов, действительно необходимо охватить несоответствие импеданса и дать особое значение SQL. В этих случаях я рекомендую следующее: Для каждого модуля, который содержит строки SQL, создайте единственный статический класс "SQL" для содержания их всех. Некоторые строки SQL, вероятно, потребуют параметров, так последовательны и помещают каждую строку позади своего собственного статического метода.
я только делаю это для случайного пользовательского приложения для создания отчетов, но оно всегда работает отлично и чувствует обновление и освобождение. И довольно хорошо возвратиться несколько месяцев спустя, чтобы сделать улучшение и найти весь SQL, ожидающий Вас в единственном файле SQL.cs. Только путем чтения, что один файл, все это возвращается, и часто это - единственный файл, который должен быть изменен.
я не вижу потребность в этих случаях для сокрытия SQL в ресурсах или в другом месте. Когда SQL важен, тогда это важно. Интересно, все больше разработчиков теперь свободно смешивает SQL с C#, включая я верю этому сайту, потому что по существу, это - каков LINQ.
Наконец, как всегда, удостоверьтесь, что Вы не восприимчивы к атакам с использованием кода на SQL. Особенно, если ввод данных пользователем включен, удостоверьтесь, что Вы используете некоторую параметризацию и что Вы не используете конкатенацию строк.
Я скажу, куда я не буду помещать его никогда, что-то, что я видел сделанный в некотором коде, который я наследовал. Именно в Java, но относится к любому языку
, базовый класс А объявил защищенные статические членские переменные для для SQL-операторов, inited к пустому указателю, с получить методом, который возвращает отдельные SQL-операторы
А sub класс для каждого поддерживаемого сервера базы данных с init методом, который присваивает членским переменным базового класса
Несколько классов DA, которые используют метод базового класса получить SQL-операторы
, класс запуска приложения с обязанностью создать корректный подкласс возражает и называет свой init метод
, я также не войду в объяснение, почему я не буду делать этого никогда :-)