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

    Cách thực hiện giao dịch trong mô hình Client - Sever

    Các bạn cho mình hỏi mình thực hiện hàm Update như này mình là client muốn update 1 tblA lên sever thì cần bảo cho server và các client biết mình đang chỉnh sửa tblA này các client khác không được chỉnh sửa (hoặc không được truy cập vào cho nhanh đi) thì làm thế nào cần thêm lệnh SQL nào vào trong hàm sau??

    Hàm update: (SQL 2005)


    Mã:
            public bool Update(string StoreName, DataTable myDataTable)        {            SqlCommand cmd = new SqlCommand();            cmd.CommandText = StoreName;            cmd.CommandType = CommandType.StoredProcedure;            cmd.Connection = myConnection;            myDataAdapter = new SqlDataAdapter(cmd);            SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myDataAdapter);            try            {                myDataAdapter.Update(myDataTable);            }            catch (SqlException ex)            {                DisplayError(ex);                return false;            }            return true;        }

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Cám ơn webshot đã nhiệt tình giúp mình...!
    Ý của mình muốn hỏi là như thế này mình đang làm 1 project theo mô hình client server mình muốn update lên server (Client và server đều có 1 bảng CSDL giống y chang nhau nhưng tất cả dữ liệu chính chỉ nằm ở server và mỗi thằng client đề chỉ có dữ liệu cảu riêng user sử dụng client đó thôi nhưng lại cần thao tác với server để cập nhật các thông tin cá nhân hay theo lô lên máy chủ để thống kê theo ngày "Hoạt động có thể online hoặc offline trong mạng lan" và mình đã có cơ chế đồng bộ hóa dữ liệu). Vấn đề là mình muốn cập nhật 1 file excel từ client vào server đọc dữ liệu tưd excel vào bảng trong buffer và khi đó kiểm tra điều kiện ràng buộc của dữ liệu xong rồi mình chỉ đẩy bảng vào hàm update rồi truyền vào tên storedprodure chứa lệnh thao tác với dữ liệu của bảng cần thao tác đó và thực hiện update lên máy chủ thôi. Nhưng ở đây bị tương tranh giữa cá giao dịch trong cùng bảng gây sai lệch dữ liệu.
    Nếu bình thường không cần quan tâm đến các client khác hoặc server đang sử dụng đến table này thì mình update ok rồi. Nhưng vấn đề là mình muốn tạo ra 1 khóa truy cập để không có 1 giao dịch nào được thực hiện khi mình đang thay đổi dữ liệu trên bảng này. (Có thể là 2-3 bảng liên quan vì mình phải cập nhật lan truyền mà) và lại ở đây mình dùng ID tự tạo (Lấy MaxOfField(ID)) không phải là tăng tự động nên khit tạo mới rất dế bị client khác truy cập vào ghi trước thì ID của mình sẽ bị trùng ngahowoawcj update mà không khóa giao dịch lại thì client khác thống kê thì dữ liệu sẽ sai.
    Mình biết là phải dùng Lock và Unlock (Khóa 1 pha, khóa 2 pha,...) để xử lý transaction nhưng mình không biết trong trường hợp của mình thì vào đâu để code khai báo bắt đầu giao dịch và kết thúc giao dịch. Lưu ý là khi này bảng dữ liệu mình đã nằm sẵn lên buffer rồi nên mình xẽ update toàn bảng xuống chứ không phải là từng lệnh insert hay delete riêng biệt.
    Mong webshot giúp mình với vì mình đang rất cần để xử lý đoạn giao dịch cập nhật này. Bạn webshot nếu có thời gian có thể sửa thêm vào menthord hoặc nếu bạn bận thì bạn chỉ cần code vào đâu như thế nào cho mình cũng được.... Thank nhìu...


    Mã:
            private SqlDataAdapter myDataAdapter;         public bool Update(string StoreName, DataTable myDataTable)        {            SqlCommand cmd = new SqlCommand();            cmd.CommandText = StoreName;            cmd.CommandType = CommandType.StoredProcedure;            cmd.Connection = myConnection;            myDataAdapter = new SqlDataAdapter(cmd);            SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myDataAdapter);            try            {                myDataAdapter.Update(myDataTable);            }            catch (SqlException ex)            {                DisplayError(ex);                return false;            }            return true;        }
    Mình đã mở kết nối đến CSDL rồi qua 1 hàm OpenDB riêng rồi nên string myConnection coi như đã có trước đó rồi vì đó là static parameter khai báo trong đầu Class DataProvide này rùi, và dữ liệu vủa bảng cần update trước đó mình đã Select lên để Add newrow vào rồi.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    trường hợp cần câu lệnh thì thường tớ hay bỏ sqlcommand đi mà viết lệnh = tay. ko biết có cách nào hay hơn ko

  4. #4
    Ngày tham gia
    Sep 2015
    Đang ở
    hà nội
    Bài viết
    0
    Cái này liên quan đến các lock của sql. Mặc định khi bạn dùng storeprocedure có sử dụng transaction để thực hiện update thì sql sẽ khóa các record đó với khóa update để không cho client khác chỉnh sửa (hình như vẫn đọc được thì phải - mình không nhớ rõ lắm). Bạn cũng có thể sử xlock (rowlock) để khóa luôn không cho client đọc cũng được. Bạn nó rõ mục đích việc khóa này mình sẽ hướng dẫn cụ thể cho bạn.

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Theo như bạn mô tả thì ở đây có tí vấn đề trong khâu thiết kế của bạn. Bạn khởi tạo mã ở client rồi cập nhật vào cơ sở dữ liệu thì khó có thể ngăn các client tạo ra các mã không trùng, vì ở client đọc dữ liệu ở csdl rồi dựa vào đó tạo mã nên sẽ gây trùng. Nếu bạn khóa ngay dữ liệu lúc client đầu tiên đọc cũng được, nhưng lỡ client đó đọc xong mà không cập nhật ngay mà để nữa ngày mới cập nhật chẳng lẽ các client khác phải chờ nữa ngày mới đọc để cập nhật tiếp? Thứ 2, như code cập nhật bạn đưa ra mình nghĩ việc cập nhật các dòng dữ liệu từ myDataTable cũng được thực hiện tuần tự từng cái chứ không phải cập nhật theo lô, vì vậy dù bạn có tạo transaction trong StoredProcedure thì cũng không ổn. Theo mình trong trường hơp của bạn mình sẽ tạo trigger trong sql để hỗ trợ thực hiện việc tạo mã là ổn và giải quyết được vấn đề xung đột dữ liệu của bạn. Khi thêm 1 dòng không truyền cho StoredProcedure field mã, mà mã để sql tự sinh ra thì sẽ không trùng.
    Mình không hiểu rõ lắm dữ liệu của bạn nên phần sửa, xóa ở các client không biết có xảy ra dữ liệu bóng ma không? Có gì trao đổi thêm

 

 

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
  •