У вас есть дочерние элементы управления, которые могут вызвать мерцание, когда их фон окрашен. Вы хотите исключить дочерние элементы управления из области рисования, добавив флаг WS_CLIPCHILDREN
к классу представления:
BOOL CVCDSOView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= WS_CLIPCHILDREN;
return CView::PreCreateWindow(cs);
}
Не связано с мерцающей проблемой:
Не вычитайте ничего для основного прямоугольника. Вы должны изменить растровое изображение на
bmpMem.CreateCompatibleBitmap(&dc, Rect.Width(), Rect.Height());
Вам не нужно dcMem.DeleteDC()
и DeleteObject(bmpMem)
MFC автоматически удалит эти объекты.
Обратите внимание, что MFC не будет автоматически отменять выбор объектов. Это обычно не имеет значения, потому что Windows выполнит необходимую очистку, как в этом примере. Но для полноты картины добавьте следующее:
CBitmap* oldbitmap = (CBitmap*)dcMem.SelectObject(&bmpMem);
...
dc.BitBlt(0,0,Rect.Width(),Rect.Height(),&dcMem,0,0,SRCCOPY);
dcMem.SelectObject(oldbitmap);
Мне кажется, что превращение тех трудно кодированных оценивает в хранимые процедуры, и ссылка на sprocs из кода вместо этого могла бы быть высокой доходностью и низким усилием.
SQL имеет много конкатенаций строк для переменных?
Если это не делает можно извлечь их помещенный их в файлах ресурсов. Но необходимо будет удалить строку conatentation в разрывах строки.
Подход хранимой процедуры, который Вы использовали, очень хорош, но иногда когда существует потребность понять то, что делает SQL, необходимо переключить от рабочей области до любимого SQL IDE. Это - единственная плохая вещь.
Для моего предложения это было бы похоже на это:
String query = "select ......."+
3000 lines.
Кому:
ResourceBundle bundle = ResourceBundle.getBundle("queries");
String query = bundle.getString( "customerQuery" );
Хорошо это - идея.
Лучшая вещь, которую я мог придумать до сих пор, состоит в том, чтобы поместить запрос в несколько хранимых процедур, тот же способ, которым я обработал бы метод, это слишком длинно в Java.
Я предполагаю, что первый вопрос, что Вы, как предполагается, делаете с ним? Если это не повреждается, бесшумно закройте его и притворитесь, что Вы никогда не видели его. Иначе осуществите рефакторинг как безумный - надо надеяться, существует некоторое условие выхода где-нибудь, которое смотрит что-то как контракт.
Я второй iBatis рекомендация. По крайней мере, можно вытянуть SQL из кода Java, что наиболее вероятное использование StringBuffer и добавление или Строка concat в XML, где просто легче поддержать.
Я сделал это для веб-приложения прежней версии, и я включил отладку и выполнил модульные тесты на ДАО и просто скопировал сгенерированный sql для каждого оператора в iBatis xml. Обработанный довольно гладкий.
Я записал инструментарий для этого некоторое время назад и использовал его в нескольких проектах. Это позволяет Вам помещать запросы в главным образом текстовые файлы и генерировать привязку и документацию для них.
Проверьте этот пример и использование в качестве примера (это - в значительной степени просто подготовленный оператор, скомпилированный в класс Java с ранней связанной/безопасной с точки зрения типов привязкой запроса).
Это генерирует некоторый хороший javadocs также, но у меня нет ни одного из тех онлайн в данный момент.
Я нахожусь в том же месте, которое Вы... Мой план состоял в том, чтобы вытянуть SQL в separate.sql файлы в рамках проекта и создать служебный метод считать файл в том, когда мне нужен запрос.
string sql = "select asd,asdf,ads,asdf,asdf,"
+ "from asdfj asfj as fasdkfjl asf"
+ "..........................."
+ "where user = @user and ........";
Запрос выводится в файл, названный usageReportByUser.sql
и становление чем-то вроде этого.
string sql = util.queries("usageReportByUser");
Удостоверьтесь, что это сделано способом, что файлы не публично доступны.
То, что я делаю в PHP, является этим:
$query = "SELECT * FROM table WHERE ";
$query .= "condition < 5 AND ";
$query .= "condition2 > 10 AND ";
и затем, после того как Вы закончили разделять на уровни на $query
:
mysql_query($query);
Один простой способ состоял бы в том, чтобы выломать их в некоторые константы. Это, по крайней мере, сделало бы код более читаемым.
Я храню их в файлах (или ресурсы), и затем читаю и кэширую их на приложении, запускаются (или на изменении, если это - сервис или что-то).
Или, просто поместите их в большой старый класс SqlQueries как consts или readonlys.
У меня был успех в преобразовании больших динамических запросов в linq-запросы. (1K строк+) Это очень хорошо работает для сценариев отчетности, где у вас много динамической фильтрации и динамической группировки на относительно небольшом количестве таблиц. Создайте edmx для этих таблиц, и вы сможете писать отличные композитные запросы с сильной типизацией.
Я обнаружил, что производительность действительно повысилась, а результирующий sql стал намного проще. Я уверен, что вы получите аналогичные результаты с Hibernate - конечно, за исключением возможности использовать linq. Но вообще говоря, если сгенерированный sql должен быть очень динамичным, то он не является хорошим кандидатом для хранимой процедуры. Запись динамического sql внутри хранимой процедуры - худший из двух миров. Если вы копаете Hibernate, я думаю, это будет хорошим решением.
С другой стороны, если запросы представляют собой простые строки с параметрами, то просто бросьте их в хранимую процедуру и дело с концом. -но тогда вы упустите возможность работать с объектами.