PDA

View Full Version : [Q] nên use nhiều form ko



kazujo
08-05-2003, 18:31
khi thiết kế 1 chương trình có nên mỗi thao tác làm trong 1 form ko, VD xóa thì gọi form xóa, thêm thì gọi form thêm hay là làm thẳng trong cái form chung luôn

nguyenthu
09-05-2003, 19:22
Chào bạn,
Cái lợi chỉ là ở sự giản dị trong cách lập trình nếu mỗi form chỉ có một chức năng nhứt định. Làm một form cho đủ loại : insert, update, delete, select... thì nó cực hơn, dễ bị error hơn. Vậy thôi.
Cái điều chính cần nhớ là :
- Tránh connect quá lâu mà không cần thiết.
- Tránh update nửa chừng trong một transaction, rồi bỏ đó làm chuyện khác, không chịu comit : bạn block hết các user khác.
- Vì vậy cho nên, phải connect xong, cho chạy một hay vài câu SQL cần thiết, rồi disconnect liền.
Điều này rất quan trọng đối với những CSDL lớn, có hàng trăm connection cùng lúc.
Thân

phuncud
10-05-2003, 10:57
Vì vậy cho nên, phải connect xong, cho chạy một hay vài câu SQL cần thiết, rồi disconnect liền.

Theo tui thì làm vậy thật bất tiện.
Ví dụ khi người dùng thao tác trên 01 form mà trên đó liên quan khá nhiều tác vụ.
Nếu bạn disconnect ngay lập tức sau mỡi tác vụ thì trong trường hợp các tác vụ xảy ra liện tục thì chẳng lẻ cứ connect rồi disc liên tục sao?

Tui thấy làm như vầy là tiện: Khi user gọi một form thì ta connect, khi thoát khỏi form đó thì ta disconect. Bởi thường sau khi làm một loạt các tác vụ trên một form thì user thường đóng form ngay sau đó.

Về vấn đề có nên gọi form khác khi bạn d,i,u hay không, theo tui nghĩ đơn giản là nếu thao tác đó phức tạp thì ta tách ra riêng một form để tránh sự nhầm lẫn, còn nếu đơn giản thì cứ để ngay trên form chính.

nguyenthu
10-05-2003, 13:43
Bạn phuncud,
Sở dĩ tôi khuyên nên đóng lẹ là vì đó là thông lệ chung cho những database lớn. Thật vậy một lập trình viên cứ để mở form ra, rồi delete 5, 10 phút sau mới đóng lại, chắc chắn là không ai làm việc được với các table mà anh ấy đang update. Cơ sở lớn nao cùng có người Trách nhiệm về system và Admin của database, nếu họ thấy một chương trình block quá 5 phút, thường là họ desable cái application của mình, và lập trình viên bị bắt buộc phải sửa lại. Hệ thống lớn ở đây tôi muốn nói là dùng cho Mainframe, và một số system lớn như Unix...
Dĩ nhiên nếu bạn làm việc trong một mạng LAN nhỏ, ít xài đến database thì không sao, và nếu bạn vừa là Chủ-trì của hệ thống và Admin của database thì bạn muốn làm gì làm.
Thân

phuncud
10-05-2003, 13:54
Ý tui muốn nói là khi mình thiết kế một chương trình end-user mà tương tác với một server (coi như đã thiết kế xong). Các câu lệnh d,i,u thường thì nó lock một table nào đó trong thời gian rất ngắn. Cho nên mình giữ connect với server đâu có ảnh hưởng đến table đó.

nguyenthu
10-05-2003, 17:04
Bạn phuncud thân,

Xin mạn phép bàn là hiện tại chỗ tôi làm việc có cho thực thi mỗi ngày 3 loại chương-trình :

1) Chương-trình on-line application : loại này cho các cô thư ký, lễ tân tiếp khách, thu-nhận hồ sơ, cho đăng ký từng người đệ đơn... Với loại này, lắm khi đợi người đối thoại móc ra thẻ kiểm tra, giấy tờ bảo hiểm xã hội, giấy khai bệnh... Cho nên đợi họ để nạp các dữ liệu vào một form, có thể đến 15 phút. Bắt buộc là khi cho hiển thị một trang (hay form), phải commit liền.

2) Chương trình tiện ích cơ sở dữ liệu (theo ngôn ngữ DB2 gọi là DBSU) : cái này dùng để cập nhật nhiều hàng dữ liệu trong một lúc, có thể là 500 hàng... thì nó chẳng khác nào mình thực hiện nhiều câu SQL liên tiếp với nhau, nó nằm trong một transaction để nếu có operation nào failed, nó rollback, nếu OK, nó commit, cho dê' việc recovery sau này (trường hợp một nửa đã commit mà OK, một nư"a đã commit mà sai ). Các chương trình này thường chỉ thực thi trong những giờ nghĩ ngơi trưa chẳng hạn, hay cuối tuần.

3) Chương trình BATCH : chỉ thực hiện vào cuối tuần, trong những ngày mà người thương không làm việc. Có thể update nhiều triệu hàng (như tăng lương...)

Nếu chương trình bạn làm không đòi hỏi phải nhập dữ liệu trực tiếp vào một form thì không sao, hay nhập rồi mới bắt đầu connect để update một lượt thì không sao. (Như loại 2, 3)

Nơi tôi làm việc, các tables chỉ mới có 4 triệu records (khoảng 250 bytes/ record), mà khi cho chạy trong tuần, lắm khi phải đợilâu (cả phút...), dùng Mainfram IBM cho nên cho cả CSDL nằm trọn trong RAM.

Có chút kinh nghiệm xin chia sẻ với các bạn vậy thôi.

Thân

phuncud
12-05-2003, 08:29
Xin tự giới thiệu đôi chút:

Tôi tốt nghiệp và đi làm được khỏang 03 năm, cho nên còn thiếu kinh nghiệm. Chương trình làm ra sử dụng trong 01 mạng LAN nhỏ trong cơ quan.

Nhân đây xin bạn Nguyenthu và các cao thủ khác xin chỉ giáo 01 chuyện.

Chương trình tơi làm bằng SQL Server, nhưng dữ liệu nguồn từ FOX. Cho nên tui dùng link server. Có một vấn đề như sau:
1 - Thường thì tôi phải chuyển dữ liệu từ FOX sang SQL. Tuy nhiện hiện SERVER đang sử dụng đã cũ, dung lượng nhỏ cho nên không chưa đủ. (trung bìng mỗi tháng phát sinh gần 4 triệu record, tháng sau tăng hơn thánh trước). Còn nếu để nguyên bằng FOX và dùng câu lệnh Openquery() thì chờ quá lâu (thời gian không thể chấp nhận được). Vậy xin hỏi có cách nào giải quyết không?
2 - Tui làm 01 Store procedure đại khái nnhư sau:

proc test
.....
begin transaction
lệnh 1
...
...
câu lệnh Openquery thao tác dữ liệu trên link server (ODBC FOX)
...
....
commit transaction


Khi viết proc thì OK. Nhưng khi thực thi thì phát sinh lỗi:

Server: Msg 7391, Level 16, State 1, Line 2
The operation could not be performed because the OLE DB provider 'MSDASQL' was unable to begin a distributed transaction.
[OLE/DB provider returned message: [Microsoft][ODBC Visual FoxPro Driver]Driver not capable]
OLE DB error trace [OLE/DB Provider 'MSDASQL' ITransactionJoin::JoinTransaction returned 0x8004d00a].


Theo tui hiểu thì do mình có những thao tác trên link server (FOX) mà SQL SERVER không kiểm soát được nên không thể đặt trong transaction được. Hiểu như vậy có đúng không ? Nếu khắc phục bằng cách nào?

nguyenthu
13-05-2003, 15:00
Phuncud thân,
Mình cũng xin tự giới thiệu, Kỹ-sư Công-Chánh Việt-Nam từ hơn 30 năm nay. Đi du học và làm việc như Kỹ-sư Xây dựng tại Bỉ quốc. Vì thích computer nên đã làm chương trình tin học cho nghề từ hơn 30 năm, sau đó mình tốt nghiệp về Tin-học, và có hành nghề Tin-học (khi là chuyên nghiệp, khi là nghiệp dư).
Mình thấy câu hỏi của bạn quá khó, vì mình chỉ xài sơ về FoxPro, và chưa xài SQL Server, nên chỉ giúp bạn một số ý kiến về : hệ-thống, kinh nghiệm xài SQL cho CSDL lớn.
1) Openquery() ở Server Fox quá lâu : mỗi lần Select hay Update một lượt, bạn làm cho bao nhiêu Row ? (Nếu khoảng 1/1000 giây một hàng là được rồi). Có dùng order by, join hay không ? Table có Index không (như Access).
2) ODBC bây giờ chấp nhận Fox và SQL Server, chỉ còn xem lại phiên bản của ODBC có hợp hay không ?
Bạn Test thành công khi viết Store Procedure, nhưng cái đó chỉ là giả thôi.
3) Khả năng của ODBC :
- SQLCA là bao nhiêu Ko ? (SQL commun area), 4Ko hay 250 bytes ?
- Có bị time out ?
4) Khi thao tác trên Server Fox, đừng blok users khác, nghĩa là tránh "exclusive mode". Nếu không, trong Store procedure, nếu cần phải chèn UID+PW của Admin vào câu connect.
Điều này rất dễ thử : bạn thao tác trên Fox Server, cho một user khác xin connect, nếu bị từ chối thì là tại vì Server Fox không chịu.
5) Bạn post câu SQL query xem !
6) Dùng Export ?
Hay có thể nào bạn cài hai DBMS trên một máy, và như vậy bạn không cần qua OBCD và qua đường truyền LAN, chắc chắn là sẽ nhanh hơn.
Thân

tuanmncisco2000
29-07-2004, 08:26
Ok, tui cũng nghĩ như vậy.
Khi thiết kế, ta không nên dùng nhiều link nhu vậy dẫn đến CSDL sẽ chậm hơn mà thôi.