Информация

Блоги


Последние записи


Теги

Записи из всех блогов на Sql.ru


Вышла книга “PowerDesigner 15. Моделирование данных”

Блог: Sybase
Доброго времени суток всем!

С гордостью сообщаю, что мы наконец-то сделали это, а именно выпустили книгу по PowerDesigner на русском языке :) Надеюсь, усилия не пройдут даром и это произведение окажется полезным русской аудитории.
Пресс-релиз о выходе книги
читать дальше...
автор: Sybase CIS добавлено: 17 май 12 просмотры: 35, комментарии: 0



Создание пользовательского меню - ASP .NET

Блог: Ramin Hashimzade
Как обещал ранее, выкладываю решение по "Создание пользовательского меню" на платформе Visual Studio 2010, языке C#. Структура Базы остается прежним, меняется только таблица BP_USER_MENU поле BP_REPORT_ID, который в свою очередь уже хранит в себе ссылку на страниц.
И так, открываем студию, создаем новый проект и например даем имя проекта Project_UserMenu. Далее добавляем новую страницу, страницу "Входа" и назовем его wfrm_login (учтите что добавление префикса в начале имена объектов, освобождает вас от не чайно использованием зарезервированных слов, в данном случаи префикс "wfrm" означает "web form"), так как эта статья носит тестовый характер, интерфейс входа в приложение будет совсем простым. Добавляем 2 TextBox , 1 Button , 1 Treeview и 1 Custom Validator для отображении ошибок.

Картинка с другого сайта.

<body>
    <form id="form1" runat="server">
    <div>
        <table class="style1">
            <tr>
                <td>
                    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                    

                    <asp:TextBox ID="TextBox2" runat="server" TextMode="Password"></asp:TextBox>
                    

                    <asp:Button ID="Button1" runat="server" Text="Login" onclick="Button1_Click" />
                </td>
            </tr>
            <tr>
                <td>
                    &nbsp;
                    <asp:CustomValidator ID="CustomValidator1" runat="server" 
                        ErrorMessage="CustomValidator"></asp:CustomValidator>
                </td>
            </tr>
            <tr>
                <td>
                    <asp:TreeView ID="cmp_Menu_TreeView" runat="server" ShowLines="true" Style="margin-right: 0px"
                        Font-Bold="True" Font-Size="Medium" ForeColor="Black">
                    </asp:TreeView>
                </td>
            </tr>
        </table>
    </div>
    </form>
</body>


Далее добавляем наши бизнес страницы который будет открываться когда будет выбрано соответствующий нод в меню. Для примера я добавляю 2 страницы с именами wfrm_form1, myfrm_form2 в проект и в таблице BP_USER_MENU в поле BP_REPORT_ID указываем меню который должен открывать эти страницы:

BP_IDBP_PARENT_IDBP_LEVEL_IDBP_MENU_CAPTIONBP_REPORT_ID
10Главное
20Отчеты
611Склад ./wfrm_form1.aspx
711Приход
811Расход
922Бухгалтерия
1022Казначейство
1193Отчет об остатках ./myfrm_form2.aspx
1293Отчет о прибыли
13103Денежные обороты
14103Касса
15103Тестовый отчет



Далее обработка кнопки Button , который в свою очередь будет создавать коннект к Базе данных и вызов метода Populate() на рисование соответствующего меню пользователя. Запрос остается тот же:

SELECT USER_MENU.BP_ID,
       USER_MENU.BP_PARENT_ID,
       USER_MENU.BP_LEVEL_ID,
       USER_MENU.BP_MENU_CAPTION,
       USER_MENU.BP_REPORT_ID
 FROM RAMIN.BP_USER t1  
  
 JOIN RAMIN.BP_USER_GROUP_MENU T
 ON T1.BP_USER_GROUP_ID = T.BP_USER_GROUP_ID
  
 JOIN RAMIN.BP_USER_MENU USER_MENU
 ON USER_MENU.BP_ID = T.BP_MENU_ID

 WHERE (T1.BP_LOGIN = 'ЛОГИН ПОЛЬЗОВАТЕЛЯ ВХОДЯЩЕГО В СИСТЕМУ')
 ORDER BY USER_MENU.BP_LEVEL_ID, USER_MENU.BP_ID



Behind Code странице wfrm_login:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Oracle.DataAccess.Client;

namespace Project_UserMenu
{
    public partial class wfrm_login : System.Web.UI.Page
    {
        string myconn;
        OracleConnection appConn;

        protected void Page_Load(object sender, EventArgs e)
        {
            cmp_Menu_TreeView.Nodes.Clear();
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            myconn = "Data Source=MYDB;User ID=" + TextBox1.Text + ";Password=" + TextBox2.Text;
            try
            {
                appConn = new OracleConnection(myconn);
                appConn.Open();
                Populate();
            }
            catch (Exception ex)
            {
                CustomValidator1.IsValid = false;
                CustomValidator1.Text = ex.Message;
                return;
            }
        }

        // Рисование меню пользователя в виде дерево.
        private void Populate()
        {
            OracleDataAdapter oraAdap = new OracleDataAdapter();
            oraAdap.SelectCommand = new OracleCommand();
            oraAdap.SelectCommand.Connection = appConn;
            oraAdap.SelectCommand.CommandText = Resource1.myQuery;
            oraAdap.SelectCommand.Parameters.Add("login", OracleDbType.Varchar2, 10).Value = TextBox1.Text;
            OracleDataReader oraRead = oraAdap.SelectCommand.ExecuteReader();

            while (oraRead.Read())
            {
                if (System.Convert.ToString(oraRead["BP_PARENT_ID"]) == "")
                {
                    TreeNode tn = new TreeNode();
                    tn.Text = (string)oraRead["BP_MENU_CAPTION"];
                    tn.Value = System.Convert.ToString(oraRead["BP_ID"]);
                    tn.SelectAction = TreeNodeSelectAction.Expand;
                    cmp_Menu_TreeView.Nodes.Add(tn);
                    tn.NavigateUrl = System.Convert.ToString(oraRead["BP_REPORT_ID"]);
                }
                else
                {
                    TreeNode tn = new TreeNode();
                    tn.Text = (string)oraRead["BP_MENU_CAPTION"];
                    tn.Value = System.Convert.ToString(oraRead["BP_ID"]);
                    tn.Target = "_blank";
                    tn.NavigateUrl = System.Convert.ToString(oraRead["BP_REPORT_ID"]);
                    AddChildNode(cmp_Menu_TreeView.Nodes, System.Convert.ToString(oraRead["BP_PARENT_ID"]), tn);
                }
            }
            oraRead.Close();
        }

        // Добавление дочерный нодов ("Как добавить дочерные ноды зная его родителскый нод")
        private void AddChildNode(TreeNodeCollection n, string val, TreeNode tn)
        {
            for (int i = 0; i < n.Count; i++)
            {
                if (n[i].Value == val)
                {
                    n[i].ChildNodes.Add(tn);
                    n[i].SelectAction = TreeNodeSelectAction.Expand;
                    n[i].NavigateUrl = "";
                }
                n[i].Expand();
                AddChildNode(n[i].ChildNodes, val, tn);
                n[i].Collapse();
            }
        }

    }
}


скриншоты теста:
Картинка с другого сайта.
Картинка с другого сайта.

И собственно сам проект:


Работа с сокетами в СУБД Caché. Пример реализации серверной части протокола WebSocket

Блог: СУБД Caché
СУБД Caché для взаимодействия через TCP/IP с удалёнными процессами посредством сокетов предоставляет низкоуровневые команды, что может представлять собой сложность для новичков.

А есть ли возможность использовать сокеты "по-другому", не теряя при этом в гибкости, скорости и удобстве разработки?

Конечно, есть: достаточно написать объектную обёртку вокруг существующих команд open,use,close и т.д. В терминах ООП - это инкапсуляция.

К счастью такой класс, даже классы - один для серверной части и один для клиентской - уже написаны и поставляются по крайней мере с версии Caché 5.2, а именно:
читать дальше...
автор: servit добавлено: 14 май 12 просмотры: 42, комментарии: 0



Блог: Stebelek
Картинка с другого сайта.
автор: Bazist добавлено: 11 май 12 просмотры: 128, комментарии: 5



Трюк с курсором

Блог: Odd SQL
Баловство, конечно, но мне кажется, имеет право на существование

В Oracle есть замечательные типы данных %ROWTYPE. В переменную такого типа можно вытаскивать данные из курсора легко и просто. К сожалению, в MSSQL подобного нет, и для каждой колонки необходимо сначала объявить переменную, затем указать ее в инструкции fetch. Если колонок много, то и без того не самая приятная работа с курсором становится еще хуже :) Читать дальше
автор: Sergey Zenzinov добавлено: 10 май 12 просмотры: 399, комментарии: 4



Блоки try-catch для программистов на T-SQL.

Блог: sqlCmd Blog
В статье обсуждается система перехвата ошибок, а именно ее конкретная реализация в языке T-SQL. Изложение ведется для "чистых" T-SQL программистов, не имеющих опыта работы с тем же механизмом в каких-либо высокоуровневых языках. Тщательно обсуждаются концепции обработанной ошибки и ее повторной генерации, а так же обсуждаются технические нюансы такой генерации. Рассматриваются уровни серьезности ошибок и возможности по перехвату ошибок периода компиляции, а не только периода исполнения. Оцениваются варианты работы того же механизма с транзакциями, обсуждается важность и необходимость функции XACT_STATE и опции XACT_ABORT при такой работе. Обсуждаются общие вопросы дизайна T-SQL кода: при каких обстоятельствах применение перехвата ошибок уместно, и когда оно избыточно, нужно ли перехваченное исключение "глотать" или же "проталкивать наверх" и т.д. Приводится готовый шаблон хранимой процедуры составленный с учетом всех таких обсуждений. Уровень материала - 200.

Перейти к статье.
автор: SamMan добавлено: 10 май 12 просмотры: 355, комментарии: 0



Обфускация SQL-кода

Блог: Odd SQL
На прошлой неделе коллеги обсуждали обфускацию C#-кода, решил написать нечто подобное для MS SQL Server. Для меня интерес скорее теоретический - мне не от кого защищать код, да и компилирование с with encryption вполне справилось бы с задачей. До этого я встречал отдельные инструменты, которые делали код нечитаемым - меняли регистр ключевых слов, переносы строк и т.д. Однако существует довольно много утилит, позволяющих отформатировать код обратно, поэтому этот метод не работает. Надо менять названия объектов, но как? Читать дальше
автор: Sergey Zenzinov добавлено: 06 май 12 просмотры: 626, комментарии: 0



Реализация самоподдерживающегося кода

Блог: Odd SQL
Статья написана довольно давно, но с заведением блога вышла задержка, поэтому была опубликована в форуме. А потом руки не доходили перенести. Дошли :)

При разработке обычно используются стандартные шаблоны процедур. Например, все процедуры должны логировать значения параметров в случае ошибки.
declare @trancount int = @@trancount;
declare @options int = @@options;
declare @params xml = (
    select
        @param1 as param1
        , @param2 as param2
        , @trancount as trancount
        , @options as options
    for xml raw, type
);
begin try
    -- Main code
end try
begin catch
    exec log_error @params = @params;
end catch;


Этот подход обеспечивает гибкость, однако при изменении набора параметров, это необходимо поддерживать, что, к сожалению, не всегда происходит.

Был разработан подход, позволяющий делать эти изменения автоматически. В текст процедуры вносятся комментарии, содержащие теги начала и конца шаблона. Далее, в базе данных создается триггер, отслеживающий изменения процедур, затем для измененных процедур запускается обработчик, который заменяет шаблоны на заготовки. Читать дальше...
автор: Sergey Zenzinov добавлено: 06 май 12 просмотры: 398, комментарии: 5



Интересная статья о критериях, которыми должна обладать CMS

Блог: CMS
Давно слежу за блогом на http://boolive.ru.
Там ведется летопись о создании CMS с нуля. Очень хорошо видно, как от статьи к статье подход автора эволюционирует. Много внимания уделяется модели данных - появилось уже даже несколько подходов.

Сейчас хочу заострить взгляд на том, как автор встроил многим уже известные критерии качественного ПО в свой подход к ее созданию. Получилось очень стройно. Вот статья
http://boolive.ru/createcms/cms-criteria.
автор: paulinep добавлено: 05 май 12 просмотры: 458, комментарии: 0



Оптимизации ввода-вывода для нагруженных баз данных

В докладе будут рассмотрены вопросы оборудования дисковых подсистем для задач SQL Server в приложениях хранилищ данных и OLTP нагрузки. Будут рассмотрены варианты использования сетей на основе Fibre Channel и коммутаторов SAN. Вы увидите какие ограничения могут накладывать на производительность ввода-вывода разные компоненты дисковой подсистемы. Будут даны основы современных дисковых подсистем и их важные особенности с точки зрения обслуживания нагрузки SQL Server. Будет показано, на какие параметры конфигурации СХД, операционной системы и СУБД нужно обращать внимание. В презентации будут представлены несколько примеров, демонстрирующих возможности современных дисковых подсистем.

Другие доклады Конференция "24 Hours of PASS. Russian Edition"
http://www.techdays.ru/videos/24%20HOP

автор: Александр Гладченко добавлено: 02 май 12 просмотры: 805, комментарии: 1


предыдущие записи