Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 5 123 ... CuốiCuối
Kết quả 1 đến 10 của 43
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Phân Quyền (Phần II : Phân Quyền Trên Methods (Form))

    Chào các bạn,

    Trong bài viết này tôi sẽ trình bày với các bạn 1 cách thức phân quyền trên methods (trong các classes) mà tôi đã học hỏi được trong quá trình làm việc. Cách thức phân quyền này sẽ đáp ứng đầy đủ các nhu cầu phân quyền trên các ứng dụng. Người sử dụng có thể tạo ra bao nhiêu [nhóm người], bao nhiêu [người sử dụng] tùy ý và tự do phân quyền cho các [nhóm người] này theo yêu cầu riêng của họ 1 cách rất dễ dàng và trực quan.

    Giả sử tôi có 1 tình huống như sau : Trong ứng dụng của tôi có nhiều nhóm người sử dụng, mỗi nhóm có quyền sử dụng các chức năng khác nhau trên ứng dụng này. Ở đây tôi chỉ đưa ra 2 nhóm người (tên nhóm chỉ mang ý nghĩa tượng trưng) làm ví dụ :
    Tôi có 1 Form đặt hàng, trên Form này có các buttons như : Thêm, Sửa, Xóa, Chấp Thuận, Từ Chối, .... và dành cho 2 nhóm người dưới đây sử dụng

    - Nhóm thứ nhất là nhóm nhân viên [ĐẶT HÀNG] : Nhóm này có nhiệm vụ đặt hàng (loại mặt hàng, số lượng cho mỗi mặt hàng, ..) khi nhận được yêu cầu cần đặt thêm hàng từ 1 nhóm người nào đó (ví dụ như nhóm Quản Lý Kho).
    - Nhóm thứ hai là nhóm [QUẢN LÝ](có thể gồm 1 hoặc hơn 1 người - chúng ta có thể hiểu là sếp của phòng này) : Nhóm này sẽ quyết định có đồng ý cho đặt số hàng này hay không (APPROVE or REJECT).


    Như vậy khi màn hình này được mở lên thì chương trình đã xác định được user đang sử dụng màn hình này thuộc nhóm người nào và được phép sử dụng các chức năng nào trên màn hình này : Như nhóm 1 thì chỉ được sử dụng các buttons : Thêm, Sửa, Xóa và nhóm được sử dụng các buttons : Chấp Thuận, Từ Chối là nhóm 2.

    Ở đây tôi đưa thêm ra 1 tình huống nữa là trên màn hình này còn có thêm 1 chức năng nào đó nữa dành cho nhóm thứ 3 mà thôi, nghĩa là những người thuộc [Nhóm 1] hoặc [Nhóm 2] sẽ không có quyền sử dụng chức năng này. Nếu 1 lúc nào đó trong [Nhóm 1] có 1 nhân viên được giao nhiệm vụ làm thêm chức năng này tạm thời trong 1 khoảng thời gian nào đó hoặc kiêm nhiệm hẳn luôn thì sao?


    => Lúc này ứng dụng của chúng ta sẽ cho phép [Admin-User] gán cho nhân viên này vừa thuộc [Nhóm 1] và [Nhóm 3] luôn thì nhân viên này sẽ có 2 tập quyền của 2 Nhóm [1 & 3] để đảm nhận công việc được giao.


    Dưới đây là các hình tuần tự cho việc phân quyền cho nhóm người sử dụng trên Form Authorization (Trên các Form dưới đây tôi đã không làm demo giống như tình huống ví dụ bên trên mà chỉ Show cho các bạn thấy màn hình hoạt động như nào cho 1 ví dụ khác đó là Form [Danh Mục Người Dùng - frmUser]). Login vào với tên PhucPHAM, pass : 123456 (user này thuộc nhóm [Quản Trị Hệ Thống] - Nếu muốn chạy được chương trình bắt buộc phải có nhóm này trước).

    - Trên màn hình này gồm có 3 methods cần phân quyền tương ứng với 3 buttons : Thêm, Sửa, Xóa. Nếu như user có đầy đủ 3 quyền trên thì đương nhiên khi mở màn hình này lên sẽ thấy cả 3 buttons như hình dưới đây



    - Tiếp theo tôi sẽ phân quyền cho nhóm [Kế Toán - Nhóm này đã được tạo trước trên Form [Nhóm Người Dùng - frmGroup]] bằng cách mở Form [Phân Quyền - frmAuthorization] -> Click chọn node [Nhóm Kế Toán] trong TreeView ở bên trái màn hình -> Sau đó click button Sửa -> Chọn [Danh Mục Người Dùng] trong TreeView -> Sau đó chọn các quyền trên Form này bằng cách check vào CheckBoxes trong ListView này :
    1. Sửa 1 người dùng
    2. Thêm 1 người dùng.





    (Có thể khi nhìn hình trên thì các bạn sẽ tự hỏi : TreeView có các node [Quản Trị Hệ Thống], [Danh Mục], [Xử Lý Nghiệp Vụ], [Báo Cáo Thống Kê] và các nodes con của [Quản Trị Hệ Thống] : [Danh Mục Người Dùng], [Danh Muc Nhóm Người Dùng], .. cũng như trong ListView có các Items như [Sửa 1 Người Dùng], [Thêm 1 Người Dùng], [Xóa 1 Người Dùng] ở đâu ra. Đó chính là MethodDescriptionAttribute mà trong code đã đánh dấu trên methods đó và nó được lưu xuống DB khi click [button GENERATE])

    - Sau đó chạy lại chương trình (bạn có thể click vào menuItem : Đăng Xuất) và Login với user : Accounting, Pass : 123456 (thuộc nhóm Kế Toán mới được phân quyền ở trên). Và lúc này mở Form frmUser lên thì sẽ không thấy button Delete đâu nữa mà chỉ có 2 button là Thêm, Sửa (tương ứng với 2 chức năng trên Form này được phân quyền ở trên).




    Và đây là Diagram của phần phân quyền : Bao gồm 8 tables



    1. tblUsers :
    2. tblGroups :
    3. tblGroupUser :
    4. tblMenu :
    5. tblMenuGroup
    6. tblModules : Table này chứa thông tin về các phần mà dự án của bạn có (trong code tôi đặt tên các modules nằm trong class clsModuleType.cs) giả sử như trong bản demo này tôi định nghĩa có 4 modules (xuất hiện trong TreeView thứ 2 của Form frmAuthorization là Quản Trị Hệ Thống, Danh Mục, Xử Lý Nghiệp Vụ và Báo Cáo Thống Kê). Các modules này sẽ được lưu xuống Database khi bạn click button [GENERATE] trên Form frmAuthorization.
    7. tblAuthorizations : Dữ liệu trong table này là các chức năng trên từng Form mà cần được phân quyền. Dữ liệu được định nghĩa trong các Business classes và nó cũng sẽ được lưu xuống DB khi click button [GENERATE] trên Form frmAuthorization.
    8. tblGroupAuthorization : Dữ liệu trong table này là các quyền được gán cho các nhóm và được lưu xuống Database khi click button [Lưu] trên Form frmAuthorization.

    Các tables [1->6] tôi đã nói ý nghĩa của nó trong Phần I rồi nên tôi không nhắc lại ở đây nữa.


    Về cấu trúc của Solution cho tutorial này để đơn giản tôi chỉ chia làm 2 Projects : Project [AuthorizationTest.Facade] (có Output Type là Class Library) bao gồm các classes : Logic, Business, DbAccess & Project còn lại là Project chính (main entry point nằm trong Project này) của chương trình. Các Forms về phân quyền (frmUser, frmGroup, frmAuthorization, ..) nằm trong folder Security của Project chính.

    Đối với dự án của các bạn có bao nhiêu Project hay bao nhiêu Solution đều có thể áp dụng cách thức phân quyền này.
    Các bạn chỉ cần nắm ý tưởng của cách phân quyền này là :

    - Khi developer viết code cần đánh dấu các classes và các methods trong classes đó (Chỉ các Classes cũng như các Methods cần phân quyền mới cần được đánh dấu) bằng các Attributes tương ứng (Có 3 Attribute classes : clsAuthorizationAttribute.cs, clsMethodBrowsableAttribute.cs, clsMethodDescriptionAttribute.cs nằm trong thư mục common của Project [AuthorizationTest.Facade]. Ba classes này rất đơn giản gần như chỉ kế thừa từ System.Attribute class mà thôi).

    (Cách sử dụng các Attribute Classes này tôi sẽ nói rõ hơn ở bên dưới).
    - Trong app.config file (chi tiết được giải thich ở dưới) chỉ ra file(s) dll nào có chứa các methods cần phân quyền để khi chạy thì chương trình sẽ đọc các methods trong đó.
    - Khi ở chế độ Edit trên Form Authorization thì sẽ xuất hiện GENERATE button (với điều kiện là key "ADMIN_MODE" trong app.config file là true). Khi button này được click thì chương trình sẽ đọc các classes được đánh dấu Attributes và tìm từng methods được đánh dấu Attributes trong Classes đó và insert xuống DB.
    - Sau khi đã có dữ liệu (các methods cần được phân quyền) dưới Database thì Admin-User có thể phân quyền sử dụng các methods này cho các nhóm người sử dụng ngay trên form này luôn.
    - Khi 1 user thuộc group(s) nào đó Login vào chương trình thì chương trình sẽ SELECT 1 tập hợp các Menus (có được qua phân quyền trên Menu), Methods (có được qua phân quyền trên Method) mà GROUP(s) đó có quyền sử dụng rồi sau đó chương trình sẽ check cái method sẽ sử dụng có nằm trong cái tập hợp ở trên hay không. (Ở đây tôi ví dụ là các buttons : Thêm, Sửa, Xóa, .. các buttons này gọi các methods tương ứng Insert, Update, Delete, .. Các bạn hoàn toàn có thể phân quyền cho sử dụng hay không các controls khác mà không cần có sự thay đổi về mặt Coding).


    * Một class quan trọng trong phần phân quyền này là clsSecurityManager.cs trong thư mục BusninessService của Project [AuthorizationTest.Facade]. Class này chứa các methods dùng để đọc các Assemblies (là các dll files được chỉ ra trong app.config file).

    * Về technique có lẽ sẽ rất khó khăn cho các bạn thuộc nhóm [Junior Developer] để các bạn có thể hiểu hết được code trong Solution này. Do đó tôi có trình bày cách thức áp dụng cho application của các bạn nếu các bạn muốn phân quyền theo cách này ngay dưới đây (các bạn không cần phải hiểu hết cũng có thể làm được):

    ÁP DỤNG :

    1. Facade Project :
    Trong các classes (Business) của mọi người class nào có functions cần phân quyền thì mọi người thêm clsAuthorizationAttribute Attribute [clsAuthorization] lên trên đầu class đó.
    Vi dụ class clsUserBS :

    [clsAuthorization]
    public class clsUserBS

    - Sau đó trên Methods (functions) cần phân quyền (trong class này luôn) thì mọi người Add Attribute (MethodDescriptionAttribute). MethodDescriptionAttribute này có 3 tham số : ModuleType (thuộc nhóm chức năng nào của dự án), Form Description, Function Description. ModuleType này tùy thuộc vào dự án bạn đang phát cần chia ra những nhóm chức năng nào thì các bạn định nghĩa và map nó vào các classes thuộc nhóm chức năng đó bằng cách khai báo trong clsMethodDescription. Như ở đây tôi định nghĩa mẫu có 4 nhóm chức năng : Quản Trị Hệ Thống, Danh Mục, Xử Lý Nghiệp Vụ và Báo Cáo - Thống Kê. Và method Insert của class User là nằm trong ModuleType là Administration, Form User sẽ sử dụng nó và mô tả nó là "Thêm Một Người Sử Dụng".

    Ví dụ method Insert:

    Mã:
    [clsMethodDescription(ModuleType.Administration, clsFormName.USER, clsFunctionName.SC_AddUser)]    public bool Insert(clsUser objUser, List<clsGroupUser> lstGroupUser)    {        DbAccess db = new DbAccess();        db.BeginTransaction();         try        {                            //1. Insert a record into Users table            db.CreateNewSqlCommand();            db.AddParameter("@LoginID", objUser.LoginID);            db.AddParameter("@Password", objUser.Password);            db.AddParameter("@FullName", objUser.FullName);            db.AddParameter("@Email", objUser.Email);            db.AddParameter("@CreatedDate", objUser.CreatedDate);            db.AddParameter("@LockedUser", objUser.LockedUser);            db.AddParameter("@LockedDate", objUser.LockedDate);            db.AddParameter("@LockedReason", objUser.LockedReason);            db.AddParameter("@LastLogIn", objUser.LastLogIn);            db.AddParameter("@LastChangedPassword", objUser.LastChangedPassword);            db.AddParameter("@DeadlineOfUsing", objUser.DeadlineOfUsing);             db.ExecuteNonQueryWithTransaction("spUser_Insert");             //2. Insert records into GroupUser table            for (int i = 0; i < lstGroupUser.Count; i++)            {                db.CreateNewSqlCommand();                db.AddParameter("@GroupID", lstGroupUser[i].GroupID);                db.AddParameter("@LoginID", lstGroupUser[i].LoginID);                db.ExecuteNonQueryWithTransaction("spGroupUser_Insert");            }             db.CommitTransaction();            return true;        }        catch        {            db.RollbackTransaction();            return false;        }    }
    Tất cả các parameters trên đều đã được viết enum hoặc thành các const trong các classes tương ứng.

    - Trong class này mọi người thêm 1 enum và 1 function nữa để trên Form có thể gọi đó là :


    Mã:
            public enum UserAction { Insert, Update, Delete, MultilangUI }        public bool IsAuthorized(UserAction action)        {            string sMethodName = string.Empty;            switch (action)            {                case UserAction.Insert:                    sMethodName = "Insert";                    break;                case UserAction.Update:                    sMethodName = "Update";                    break;                case UserAction.Delete:                    sMethodName = "Delete";                    break;                     }             return clsSecurityManager.IsAuthorized(typeof(clsUserBS).GetMethod(sMethodName));        }
    + Enum UserAction : Có các phần tử là Insert, Update, Delete, MultilangUI. Cái này tùy thuộc vào các Form mà mọi người có thể định nghĩa các phần tử tương ứng.
    + Function IsAuthorized : Dùng để check action (Insert, Update ...) được gọi từ trên Form có hợp lệ hay ko?


    2. Trên Form :
    Đơn giản thêm 1 function để set phần phân quyền cho Form bằng cách gọi funtion IsAuthorized từ Business class. Function này sẽ được gọi ở sự kiện Form_Load hoặc Form_Shown của Form tùy thuộc vào bạn.

    Ví dụ Form Danh Mục Người Dùng:

    Mã:
    private void SetAuthorization()    {        ucDataButton1.AddNewVisible = userBS.IsAuthorized(clsUserBS.UserAction.Insert);        ucDataButton1.EditVisible = userBS.IsAuthorized(clsUserBS.UserAction.Update);        ucDataButton1.DeleteVisible = userBS.IsAuthorized(clsUserBS.UserAction.Delete);                //ucDataButton1 là 1 user control chứa các buttons : Thêm, Sửa, Xóa, ... trong folder UserControl của Project AuthorizationTest.Main        //userBS là 1 instance của class clsUserBS    }
    3. File app.config

    Mã:
    <?xml version="1.0" encoding="utf-8" ?><configuration>  <configSections>    <section name="security" type="System.Configuration.DictionarySectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>  </configSections>  <security>    <add key="AuthorizationTest.Facade" value="true" />  </security>    <connectionStrings>    <!--<add name="DBConn" connectionString="Data Source=VIETDUC\SQLSERVER_2005; Initial Catalog=Framework; User Id=sa; Password=admin2005"/>-->    <add name="DBConn"            connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DB\Framework.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"            providerName="System.Data.SqlClient" />  </connectionStrings>  <appSettings>    <add key="ADMIN_MODE" value="true"/>  </appSettings></configuration>
    Giải thích :

    <security>
    <add key="AuthorizationTest.Facade" value="true" />
    </security>

    Ở đây là chỉ ra dll file : AuthorizationTest.Facade.dll mà chương trình sẽ đọc các functions có Attribute [clsMethodDescription ..] nằm trong các classes có Attribute [clsAuthorization]. Do đó chỉ các business class nào có phân quyền các methods của nó thì mới cần thêm Attribute này trên đầu class đó. (Nếu dự án của bạn lớn thì có thể có nhiều hơn 1 dll cần phân quyền ở đây - cái này tùy thuộc vào Architecture mà bạn đang xây dựng)

    <appSettings>
    <add key="ADMIN_MODE" value="true"/>
    </appSettings>

    Chương trình dựa vào giá trị true/false để có cho hiển thị button [Update Menu - Cập nhật designed menu xuống DB] trên Main Form & button [GENERATE - Cập nhật các functions có đánh dấu cần phân quyền (qua Attribute) xuống DB] trên Form Authorization (ở chế độ Edit) hay không.



    P/S :

    * Bài viết không thể đi sâu vào tất cả chi tiết của phần phân quyền do đó có vấn đề gì chưa rõ ràng các bạn có thể đặt câu hỏi tôi sẽ trả lời các bạn trên diễn đàn này. (Nếu muốn đọc hiểu bài code của bài viết này thì các bạn phải
    tương đối rõ về mô hình 3 lớp - tất nhiên ở đây tôi không nói tới Senior Developers [IMG]images/smilies/smile.png[/IMG].)

    * Do viết lại Demo Solution đưa lên đây nên có thể có bugs (tới thời điểm này cá nhân tôi chạy thì bình thường). Do đó nếu các bạn download về chạy phát hiện ra bugs thì post lên giùm tôi nhé.

    * Nếu các bạn muốn chạy từ đầu nghĩa là trong DB chưa có dữ liệu thì các bạn chú ý tới vấn đề sau : Default phải có 1 LoginID, Password để có thể Login vào chương trình. Trong này có 1 User : PhucPHAM, Password : 123456 thuộc nhóm [Quản Trị Hệ Thống]. Bắt buộc phải có những thông tin này trong table tblUsers & tblGroups. Tất nhiên là các bạn có thể thay đổi bằng tên user khác cũng như tên group khác nhưng Group đó phải có Field IsAdmin = true & 1 User thuộc nhóm này.

    * Khi chạy các bạn có thể Restore DB trong thư mục Release/DB vào trong SQL Server 2005 (nhớ sửa ConnectionString trong app.config) hoặc có thể để nguyên như vậy để Test.

    * Nếu dữ liệu trong DB là empty ngoại trừ có 1 thông tin về Admin Group & 1 User thuộc nó thì các bạn nhớ Set

    Mã:
    <appSettings>    <add key="ADMIN_MODE" value="true"/> //Nếu = "false" có nghĩa chương trình sẽ lấy dữ liệu từ DB lên để bind cho Menu => Không có MenuItem nào hết.  </appSettings>

    Khi có giá trị true thì chương trình sẽ để nguyên Menu được Design trên Main Form. Lúc này sẽ xuất hiện button [Update Menu]. Các bạn Click button để Insert các Menu Item của Menu trên xuống DB. Sau đó mở Form [frmAuthorization : Phân Quyền Cho Nhóm Người Dùng] -> Click button [Sửa] -> Xuất hiện button [GENERATE] -> Click button này để insert toàn bộ dữ liệu từ các ModuleType, MethodDescription, .. vào tables (tblModules, tblAuthorization) trong DB.

    Ngay tại thời điểm này các bạn đã có thể tạo ra các Groups (trên Form Danh Mục Nhóm Người Dùng) cũng như các Users (trên Form Danh Mục Người Dùng) và phân quyền các methods cho các nhóm người dùng, tuy nhiên tại vì lúc này Menu trong Form [Phân Quyền Cho Nhóm Người Dùng] đang Empty do đó chưa phân quyền cho Menu được. Các bạn muốn phân quyền Menu cho các nhóm người dùng thì (mở file app.config bằng tay và set <add key="ADMIN_MODE" value="false"/> HOẶC click vào MenuItem [Cập Nhật Menu] -> Form [Set ADMIN_MODE] xuất hiện, các bạn chọn Off và click OK button thì nó sẽ Update key ADMIN_MODE = "false"). Sau đó các bạn chạy lại chương trình lúc này chương trình sẽ lấy dữ liệu từ DB cho Menu cũng như phần Phân Quyền.



    Link Phần I : http://forums.congdongcviet.com/showthread.php?t=26610

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Thank nhiều, rất hay, mong bạn post thêm nhiều bài như thế này

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    éc , bạn phúc phạm cho mình làm phiền cái này tý nhé , tại sao khi minh tạo form , minh muốn liên kêt cái menuItem đến form đó thì mình có gõ vào Tag của nó tên form nhưng vẫn khi cick vào nó vẫn không show cái form đó ra, nếu mình gõ thếm code này vào :
    private void mnuOk_Click(object sender, EventArgs e)
    {
    frmOk viet = new frmOk();
    viet.MdiParent = this;
    viet.Show();
    }
    với tên form của mình là frmOK, và cái menu Item ten là Ok luôn, thì khi chạy nó có hiện ra , nhưng khi set cái <add key="ADMIN_MODE" value="false"/> thì nó lại không show ra được , bạn trả lời nhanh giùm mìn nhé ,mình đang cần nó lắm [IMG]images/smilies/biggrin.png[/IMG][IMG]images/smilies/smile.png[/IMG]

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    private void mnuOk_Click(object sender, EventArgs e)
    {
    frmOk viet = new frmOk();
    viet.MdiParent = this;
    viet.Show();
    }
    Cái này là dùng để chạy ở chế độ Admin (Admin_Mode = true nghĩa là không lấy Menu ở DB) thì OK.Tuy nhiên khi menu đã được lấy ở DB (Admin_Mode=false) thì nó sẽ tự động được tạo sự kiện Click (lúc này nó Show Form trong sự kiện Click là giá trị mà khi tạo MenuItem bạn đã gán tên Form cho Property Tag của nó).

    * Bạn muốn có thêm Form mới (tất nhiên là có cả Menu mới) =>
    1. Bạn tạo Form bình thường
    2. Bạn tạo thêm 1 Menu Item rồi Add vào menu (gán tên Form vào thuốc tính Tag của MenuItem này).
    3. Chạy ở chế độ Admin (Admin_Mode = true trong app.Config file)
    4. Click Update_Menu button để cập nhật Menu mới thêm vào DB.

    Và sau 4 bước trên bạn có thể set Admin_Mode = false để chạy ở chế độ bình thường.

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi phucpham
    Cái này là dùng để chạy ở chế độ Admin (Admin_Mode = true nghĩa là không lấy Menu ở DB) thì OK.Tuy nhiên khi menu đã được lấy ở DB (Admin_Mode=false) thì nó sẽ tự động được tạo sự kiện Click (lúc này nó Show Form trong sự kiện Click là giá trị mà khi tạo MenuItem bạn đã gán tên Form cho Property Tag của nó).

    * Bạn muốn có thêm Form mới (tất nhiên là có cả Menu mới) =>
    1. Bạn tạo Form bình thường
    2. Bạn tạo thêm 1 Menu Item rồi Add vào menu (gán tên Form vào thuốc tính Tag của MenuItem này).
    3. Chạy ở chế độ Admin (Admin_Mode = true trong app.Config file)
    4. Click Update_Menu button để cập nhật Menu mới thêm vào DB.

    Và sau 4 bước trên bạn có thể set Admin_Mode = false để chạy ở chế độ bình thường.
    mình đã làm vậy nhiều lần mà vẫn không được , mình cũng có code lại trong file Main.cs kĩ lắm , nhưng ko hỉu sao vẫn không được : mình sắp báo cáo luận văn , chỉ còn vấn đề này nữa mà sao răc rối quá

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    mình đã có làm vậy trong file main.cs rồi ,nhưng vẫn khồng được ,mình nghĩ là do khi add datasuorce no không đúng , vì mỗi khi mà chạy cung luc SQLSERVER Management và studio , thì studio sẽ báo lỗi là file Framework đã được sử dụng bởi chương trình khác , mình không hỉu sao lại vậy , bạn có thể giải thích giùm mình được không

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mình gởi cái file app.config cho bạn xem thử nhé


    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <configSections>
    <section name="security" type="System.Configuration.DictionarySectionHandle r, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </configSections>
    <security>
    <add key="AuthorizationTest.Facade" value="true" />
    </security>
    <connectionStrings>
    <add name="DBConn" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Documents and Settings\le viet\Desktop\PhanQuyen1\Main\DB\Framework.mdf;Inte grated Security=True;Connect Timeout=30;User Instance=True"
    providerName="System.Data.SqlClient" />
    <add name="AuthorizationTest.Main.Properties.Settings.F rameworkConnectionString"
    connectionString="Data Source=LEVIET;AttachDbFilename=C:\Documents and Settings\le viet\Desktop\PhanQuyen1\Main\DB\Framework.mdf;Pers ist Security Info=True;User ID=sa;Password=724293dt"
    providerName="System.Data.SqlClient" />
    </connectionStrings>
    <appSettings>
    <add key="ADMIN_MODE" value="true"/>
    </appSettings>
    </configuration>

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Lỗi mà bạn vừa nói có thể là bạn chạy bằng SQL Express. Khi chạy từ VS (click F5) thì nó sẽ copy database file ra thư mục tương ứng (Debug or Release). Có thể khi đó file DB trong thư mục này được truy xuất nên gây ra lỗi.

    Bạn có thể sửa lỗi này bằng cách delete folder DB trong Debug hoặc Release trước để nó Copy DB file ra hoặc không cho nó Copy ra các folder này hoặc chạy trực tiếp file .exe hoặc nếu muốn bạn có thể chạy trên SQL Server.

    Còn trường hợp bạn nói là không link Form được thì bạn nên tìm hiểu kỹ hơn (chẳng hạn nhu debug code) tại vì code trên máy tôi chạy bình thường.

    Bạn nhớ là MenuItem_Click là sự kiện được viết để set Event khi bind menu từ DB lên chứ nó không phải là sự kiện được sinh ra khi bạn double Click vào MenuItem ở chế độ Design.

    Ps : Nếu chưa được thì bạn cứ Post câu hỏi lên.


    ======

    <add name="AuthorizationTest.Main.Properties.Settings.F rameworkConnectionString"
    connectionString="Data Source=LEVIET;AttachDbFilename=C:\Documents and Settings\le viet\Desktop\PhanQuyen1\Main\DB\Framework.mdf;Pers ist Security Info=True;User ID=sa;Password=724293dt"
    providerName="System.Data.SqlClient" />
    Bạn tạo thêm 1 connection mới. Vậy bạn đang sử dụng Connection nào?
    ======

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Bạn cho mình hỏi cái này nữa , add datasource vào folder AuthorizationTest.Facade ko vậy ạ , mình cũng chưa thử lại như bạn nói , để mình thử xem rồi hỏi bạn sau , cảm ơn bạn nhé

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mình làm được rồi , không để ý kĩ ,nhảm nhí quá , tại mấy lo nay lo làm cái hệ thống , gần đến hạn báo cáo mới coi cái này , nên hơi bối rối, cảm ơn bạn phúc phạm nhé , bạn nhiệt tình quá :

 

 
Trang 1 của 5 123 ... CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •