markdown:
Trang chủ
|
Dịch vụ
|
Catalog
|
Thanh toán
|
Liên Hệ
Giỏ hàng
(0)
Gioi thieu
Hình ảnh hoạt động
Sơ đồ tổ chức
Lịch sử hình thành
Giới thiệu công ty
Danh muc
Vật liệu mài mòn
Dụng cụ cầm tay
Dụng cụ dùng điện
Dụng cụ đo chính xác
Thiết bị ngành hàn
Điện và thiết bị điện
Bảo hộ lao động
Vệ sinh công nghiệp
Vận chuyển nâng đỡ
Bảo quản đóng gói
Sản phẩm hóa chất
Dụng cụ dùng khí nén
Thiết bị viễn thông
Thiết bị y tế
Xem tất cả
Nha san xuat
3M
Advance
AEG
Agilent
AGP
Aikyo
Alspec
AMP
Amtek
Apech
Asak
Asaki
Barker
BDS
Xem tất cả
Tin tuc
Nha san xuat
Dang nhap
Xuất xứ
» Ý
Xem theo danh sách
Xem thư viện
Máy hút bụi Bosch GAS 11-21
Mã hàng : BOS-112-048
Bosch
Ý
3,327,000 VNĐ
Máy hút bụi nước Comet AS 20
Mã hàng : CMI-020-001
Không có
Ý
Xin liên hệ
Máy hút bụi nước Comet AS 22
Mã hàng : CMI-022-002
Không có
Ý
Xin liên hệ
Máy hút bụi nước Comet AS 30
Mã hàng : CMI-030-003
Không có
Ý
Xin liên hệ
Máy hút bụi nước Comet AS 35-PRO
Mã hàng : CMI-035-004
Không có
Ý
Xin liên hệ
Máy hút bụi nước Comet AS 70-PRO
Mã hàng : CMI-070-005
Không có
Ý
Xin liên hệ
Máy hút bụi nước Comet AS 80 PRO BI-POWER
Mã hàng : CMI-080-006
Không có
Ý
22,829,000 VNĐ
Máy hút bụi nước Comet AS 90 PRO BI-POWER
Mã hàng : CMI-090-007
Không có
Ý
Xin liên hệ
CÔNG TY THIẾT BỊ CÔNG NGHIỆP GTG
2/64C Đất Thánh, P.6, Q.Tân Bình, TP HCM
Điện thoại: 08 3868 6666
Fax: 08 3868 6688
Giấy ĐKKD số: 0303059482 tại TP HCM
CHÍNH SÁCH BÁN HÀNG
- Chính sách bảo mật thông tin
- Chính sách vận chuyển
- Quy trình giao hàng
- Chính sách đổi trả hàng
HỖ TRỢ KHÁCH HÀNG
- Hướng dẫn mua hàng
- Hướng dẫn thanh toán
- Các hình thức mua hàng
- Sơ đồ đường đi
Trụ sở tại Hà Nội:
Địa chỉ: 71 Hoàng Cầu, P. Ô Chợ Dừa, Quận Đống Đa
Điện thoại: 04 3901 6666 - Fax: 04 3910 6666
Tắt [X]
Dụng cụ cầm tay
Chìa lục giác
|
Búa rìu
|
Cảo
|
Cờ lê mỏ lếch
|
Dụng cụ cắt
|
Dụng cụ dùng pin
|
Dụng cụ tổng hợp
|
Êtô
|
Kiềm
|
Ống đếu
|
Tuốt nơ vít
Dụng cụ dùng điện
Máy bào
|
Máy cắt
|
Máy chà nhám
|
Máy cưa
|
Máy đánh bóng
|
Máy đục bê tông
|
Máy khoan
|
Máy mài
|
Súng thổi hơi nóng
Thiết bị điện
Ampe kìm
|
Đo điện trở cách điện
|
Đồng hồ vạn năng
Dụng cụ đo chính xác
Máy đo khoảng cách
|
Dụng cụ cân bằng laser
|
Máy đo nhiệt độ
|
Máy đo độ ẩm
|
Thước kẹp caliper
|
Thước panme
Bảo hộ lao động
Bình chữa cháy
|
Nón | mặt nạ
|
Quạt công nghiệp
|
Thang
|
Quần áo bảo hộ
|
Găng tay bảo hộ
|
Giày ủng bảo hộ
Vận chuyển bảo quản
Con đội
|
Palăng | tời
|
Xe đẩy
|
Thùng đựng dụng cụ
Trang chủ
|
Dịch vụ
|
Catalog
|
Tin tức
|
Liên hệ
Đang online :145 - Tổng truy cập : 183,823,059
+ + + + + + + +
Dụng cụ cầm tay nhập khẩu
Dụng cụ điện cầm tay
Dụng cụ đo chính xác


markdown:
|
|
THỂ LỆ CHƯƠNG TRÌNH & GIẢI THƯỞNG
TiếngAnh123 Online English Contest for KIDS là chương trình thi đấu tiếng Anh hàng năm dành cho các
Phần luyện tập
Bao gồm 20 vòng luyện tập, dựa trên 20 đơn vị kiến thức ở sách giáo khoa của học sinh. Mỗi vòng có 4 bài luyện tập. Mỗi bài luyện tập có 10 câu hỏi. Học sinh có 15 phút để hoàn thành một bài luyện tập.
Không giới hạn số lần làm bài, khi nào vượt qua 20 vòng sẽ đủ điều kiện tham gia vòng thi đấu.
Thứ tự xếp hạng được xác định bằng: số điểm đạt được, thời gian hoàn thành bài thi và thời điểm nộp bài (trong trường hợp bằng điểm và bằng thời gian làm bài).
Phần chung kết
Bao gồm một đề thi.
Mỗi thành viên chỉ được làm bài thi 1 lần duy nhất.
Điểm sẽ tự động lưu sau khi người chơi hoàn thành nên hãy cân nhắc thật kỹ trước khi bắt đầu.
Thứ tự xếp hạng được xác định bằng: số điểm đạt được, thời gian hoàn thành bài thi.Người chiến thắng vòng này sẽ được trao giải thưởng
Giải thưởng
Giải nhất: 3 điểm thành tích + 1 thẻ học tiếng Anh trực tuyến TiếngAnh123 (VIP hoặc GOLDENKIDS) + 500,000 VNĐ tiền mặt
Giải nhì: 2 điểm thành tích + 1 thẻ học tiếng Anh trực tuyến TiếngAnh123 (VIP hoặc GOLDENKIDS) + 300,000 VNĐ tiền mặt.
Giải ba: 1 điểm thành tích + 1 thẻ học tiếng Anh trực tuyến TiếngAnh123 (VIP hoặc GOLDENKIDS) + 200,000 VNĐ tiền mặt.
LỰA CHỌN CHƯƠNG TRÌNH THI ĐẤU
Dưới đây là 3 chương trình thi đấu tương ứng với 3 trình độ khác nhau, em hãy lựa chọn chương trình phù hợp để tham gia thi đấu.
3
Online English Contest for kids
Lớp 3
Chương trình thi đấu lớp 3 - tương đương với trình độ lớp 3. Chương trình chỉ dành cho các bạn đang là HS lớp 3 hoặc đầu lớp 4.
4
Online English Contest for kids
Lớp 4
Chương trình thi đấu lớp 4 - tương đương với trình độ lớp 4. Chương trình chỉ dành cho các bạn đang là HS lớp 4 hoặc đầu lớp 5.
5
Online English Contest for kids
Lớp 5
Chương trình thi đấu lớp 5 - tương đương với trình độ lớp 5. Chương trình chỉ dành cho các bạn đang là HS lớp 5 hoặc đầu lớp 6.

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Truncated: length

WARC-Identified-Payload-Type: text/html

Content-Type: text/html; charset=utf-8

Connection: close

Vary: Accept-Encoding

Set-Cookie: php7_ta_123_session_id=8netgq2s9o0fb4br9iufbl00i4; expires=Wed, 23-Aug-2017 10:57:44 GMT; Max-Age=2592000; path=/; domain=.tienganh123.com

Cache-Control: no-store, no-cache, must-revalidate

Pragma: no-cache


markdown: **XUẤT XỨ**» Nhật Bản **Mã mua hàng : NAC-602-255** **Mã mua hàng : NAC-602-256** **Mã mua hàng : NAC-602-257** **Mã mua hàng : NAC-602-258** **Mã mua hàng : NAC-602-259** **Mã mua hàng : NAC-602-260** **Mã mua hàng : NAC-602-261** **Mã mua hàng : NAC-602-262** **Mã mua hàng : NAC-602-263** **Mã mua hàng : NAC-602-264** **Mã mua hàng : NAC-602-265** **Mã mua hàng : NAC-602-266** **Mã mua hàng : NAC-602-267** **Mã mua hàng : NAC-602-268** **Mã mua hàng : NAC-602-269** **Mã mua hàng : NAC-602-270**

WARC-Identified-Payload-Type: application/xhtml+xml

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Vary: Accept-Encoding,User-Agent

Content-Type: text/html


markdown:
|
|
## TX 5x65 Vít sao điện tử cách điện 1000V Vata VDE 9233202
|Nhãn hàng:||
|**TX 5x65 Vít sao điện tử cách điện 1000V VDE 9233202**
- Tiêu chuẩn: DIN/ISO
- Cách điện 1000V
- Kích thước: TX 5x65
**Các sản phẩm khác:** **- Vít sao điện tử cách điện 1000V Vata VDE 9233203** **- Vít sao điện tử cách điện 1000V Vata VDE 9233204**


markdown:
**XUẤT XỨ**» Nhật Bản **Mã hàng : NAC-602-612**
Giá : 4,817,000 VNĐ
**Mã hàng : NAC-602-613**
Giá : 4,817,000 VNĐ
**Mã hàng : NAC-602-614**
Giá : 4,817,000 VNĐ
**Mã hàng : NAC-602-615**
Giá : 5,128,000 VNĐ
**Mã hàng : NAC-602-616**
Giá : 5,128,000 VNĐ
**Mã hàng : NAC-602-617**
Giá : 5,128,000 VNĐ
**Mã hàng : NAC-602-618**
Giá : 5,128,000 VNĐ
**Mã hàng : NAC-602-619**
Giá : 5,128,000 VNĐ
**Mã hàng : NAC-602-620**
Giá : 5,128,000 VNĐ
**Mã hàng : NAC-602-621**
Giá : 5,128,000 VNĐ
**Mã hàng : NAC-602-622**
Giá : 5,128,000 VNĐ
**Mã hàng : NAC-602-623**
Giá : 5,128,000 VNĐ
**Mã hàng : NAC-602-624**
Giá : 5,128,000 VNĐ
**Mã hàng : NAC-602-625**
Giá : 5,527,000 VNĐ
**Mã hàng : NAC-602-626**
Giá : 5,527,000 VNĐ
**Mã hàng : NAC-602-627**
Giá : 5,527,000 VNĐ


markdown:
# publicación de artículos
Ngân sách $15000-125000 CLP
Publicación de artículos semanal. Tema: Marketing B2B, Fidelización de clientes, Marketing digital.
## 20 freelancer đang chào giá trung bình $58055 cho công việc này
[gustavog1977](/u/gustavog1977.html)
Hola,
Mi nombre es Gustavo.
Llevo siete años trabajando como redactor y traductor freelance.
He escrito algo recientemente sobre el marketing digital. No sé qué grado de conocimiento de la temática se requiere p
[Thêm](#)
[angiesil1983](/u/angiesil1983.html)
Hola, he leído tu proyecto a detalle. Me encantan las correcciones de textos a todo tipo de documento en español. La escritura creativa, las redacciones para blogs, artículos o páginas web. Si buscas calidad en estos s
[Thêm](#)
[pablo34](/u/pablo34.html)
Hola, podría por favor saber que tipo de artículos esperan? largo, contexto etc Cuantos mas detalles pueden suministrar mejor enfocado estaría para cotizar correctamente Saludos y gracias
[samuelarismendi](/u/samuelarismendi.html)
I have a bachelors degree in journalism, I know how to write articles and I have 3 years experience as a community manager in a company called Pamax. So I have the skills to do the job. Contact me
[Carli7ax](/u/Carli7ax.html)
Buenas tardes: Poseo amplia red de contactos, como también múltiples plataformas de difusión para sus artículos. Gracias por su atención y tiempo.
[Doriad](/u/Doriad.html)
Hola! Tengo español nativo, escritura en inglés avanzado. Buena redacción. Espero cumplir con el perfil que busca. Gracias!
[abrilr21](/u/abrilr21.html)
Disponibilidad inmediata para trabajar en su proyecto. Realmente interesado.
[globalvirtualAss](/u/globalvirtualAss.html)
As a Venezuelan Consultant (Spanish Native Speaker) my client will be receiving the best and most professional project they deserve. We invite my client to have an Online Meeting so we can discuss the project in detail
[Thêm](#)
[ariannaarends](/u/ariannaarends.html)
Mi nombre es Arianna Arends, tengo 20 años y soy de Venezuela.
He realizado cursos acerca de marketing digital, manejo de redes sociales, entre otros...
He promocionado algunas compañías en redes sociales y han quedad
[Thêm](#)
[artistixeit](/u/artistixeit.html)
***We have done similar work according to your requirement ***
Please check the work below:
http://www.artistixeit.com/
http://hollanddutchsports.com/
https://www.tomtom.com/en_in/
http://hollanddutchsports
[Thêm](#)
[nabuccco](/u/nabuccco.html)
Me gusta hacer las cosas bien a la primera. Sigo muy bien las instrucciones o protocolos establecidos.

X-Cache: MISS

Server: nginx

Accept-Ranges: bytes

X-Frame-Options: SAMEORIGIN

Vary: Accept-Encoding, X-Authenticated

Content-Type: text/html; charset=UTF-8


markdown:
# Outbound Telemarketing for Final Expense Life Insurance
Ngân sách $2-8 USD / giờ
I am looking for a call center that is currently calling for or has recently called for final expense life insurance for seniors (ages 50-80).
## 6 freelancer đang chào giá trung bình $7/giờ cho công việc này
[rodrirosa123](/u/rodrirosa123.html)
Hello, my name is Pablo Rosales and I live in Nicaragua. I am very organized, very efficient and very professional. I have a Bachelors in Management from an USA University.
I am also very friendly and patient when i
[Thêm](#)
[ChrissBrown](/u/ChrissBrown.html)
Am running my own call center and we are currently working on the same project. I have experienced agents ready to dial on it .
[punit691986](/u/punit691986.html)
I believe i have the skills and experience to complete the project with utmost importance and due diligence.
[yourvirtualworld](/u/yourvirtualworld.html)
I believe that my more than 7 years of experience in the outsourcing industry as well as from an international IT company like SUN Microsystems would be of enormous benefit to your organization.
I have played a major
[Thêm](#)


markdown:
# Translate Something
Ngân sách ￥80-240 CNY
translate something
## 65 freelancer đang chào giá trung bình ￥168 cho công việc này
[desource2012](/u/desource2012.html)
Ready to work with you.I can assure you of my timeliness, quality and experience. I can start work immediately.
Relevant Skills and Experience
With our 10 years of experience and 1700+ translation projects i can assu
[Thêm](#)
[BTranslated](/u/BTranslated.html)
Dear Sir (Ma'am) Thank you very much for your Project.
We are on the market for 5 years, working with the best and trustful professionals from all over the world.
Experienced in all sorts of areas, all native guarant
[Thêm](#)
[Universal99](/u/Universal99.html)
Dear sir
We are a professional specialist native translator team.NO GOOGLE translate only 100% HUMAN TRANSLATOR.
wait your respond
With best regards
universal99
Relevant Skills and Experience
......................
[Thêm](#)
[TraductaInc](/u/TraductaInc.html)
Dear Client,
In response to your job posting, please consider my application. I'm happy to provide accurate, professional translation services.
Beyond general translation, we have translation expertise in web con
[Thêm](#)
[JoyceConyers](/u/JoyceConyers.html)
Hello Sir/Mam
Thank you for checking my proposal. Please consider my application.
I am a certified Translator. Certified Translators are ready to help you. Will translate your documents in time. I never mistake
[Thêm](#)
[TransPerfect16](/u/TransPerfect16.html)
Award winning translation services of high quality by native translators at excellent prices by TransPerfect16.
Best Regards
Transperfect16
Relevant Skills and Experience
Award winning translation services of high
[Thêm](#)
[DaTranslationLtd](/u/DaTranslationLtd.html)
Da-Translation Ltd. is a group of professional translators who provide high quality and error-free translations. We have a Team of Native Translator for your task.
Relevant Skills and Experience
We work until our Cli
[Thêm](#)
[PhDWriting](/u/PhDWriting.html)
I look forward to speaking to you further to discuss your writing needs, with my commitment to providing a first-class service at all times, my writing service is one you can rely on.
Relevant Skills and Experience
I
[Thêm](#)


markdown:
Đăng nhập
Quên mật khẩu
Mở tài khoản
Đổi mật khẩu
Thông tin cá nhân
Đăng xuất
Giao dịch trực tuyến
Bảng giá đặt lệnh
Tổng quan tài khoản
Trạng thái tài sản
Mua bán cổ phiếu
Tra cứu quyền mua
Giao dịch tiền
Lãi lỗ danh mục
Báo cáo nợ
Trung tâm tư vấn
Cổ phiếu khuyến nghị
Sàng lọc cổ phiếu
Biểu đồ kỹ thuật
Thông tin thị trường
Tổng quan thị trường
Thống kê thị trường
Thông tin cổ phiếu
Lịch sự kiện
Tin tức
Cảnh báo đặc biệt
Chứng khoán phái sinh
Bảng giá phái sinh (sắp ra mắt)
Hợp đồng chứng khoán phái sinh
Kiến thức về chứng khoán phái sinh
Giao dịch phái sinh(sắp ra mắt)
Dịch vụ
Dịch vụ chứng khoán
Danh mục ký quỹ
Dịch vụ Ngân hàng đầu tư
Dịch vụ trái phiếu
Hướng dẫn nộp tiền
Hướng dẫn rút tiền
Câu hỏi thường gặp
Biểu phí Dịch vụ
Biểu mẫu
Về VNDIRECT
Tổng quan VNDIRECT
Tin VNDIRECT
Cơ hội nghề nghiệp
Văn hóa VNDIRECT
Quan hệ cổ đông
Mạng lưới chi nhánh
Công ty Cổ phần cơ khí Đông Anh Licogi (CKD: UPCOM)
Lĩnh vực:
Vật liệu cơ bản
> Ngành:
Kim loại công nghiệp
Doanh nghiệp
Quyền sở hữu
Biểu đồ kỹ thuật
Tin doanh nghiệp
Báo cáo tài chính
Thống kê thị trường
Phản hồi về dữ liệu
Simple Moving Average (SMA)
Exponential Moving Average (EMA)
Bollinger Bands (BBands)
Money Flow Index (MFI)
MACD
Parabolic SAR (PSAR)
Rate of Change (ROC)
Relative Strength Index (RSI)
Slow Stochastic (SS)
Fast Stochastic (FS)
Volume + MA
Williams %R
Line
SP Line
Candlestick
OHLC
Mountain
SP Mountain
Compare
with:
Dividends
Hotline: 1900 5454 09 - 043.941.0622
Email: support@vndirect.com.vn
Mạng lưới chi nhánh
Công cụ giao dịch
Giao dịch trực tuyến
Mobile Trading
Bảng giá thông minh
Thông tin tư vấn
Cổ phiếu khuyến nghị
Biểu đồ kỹ thuật
DataFeed
Hướng dẫn
Hướng dẫn lệnh điều kiện
Đăng ký và sử dụng OTP
Hỏi đáp
Chat với chúng tôi
Mở tài khoản

X-Content-Type-Options: nosniff

Strict-Transport-Security: max-age=31536000; includeSubDomains

X-XSS-Protection: 1; mode=block

Content-Language: vn


markdown:
Lần đầu tiên, Trung Quốc trưng bày xe thiết giáp và các thiết bị quân sự khác tại một hội chợ quân sự Châu Âu, vừa khai mạc tại phía Bắc thủ đô Paris của Pháp.
Sáu công ty quốc phòng Trung Quốc đã trình làng các thiết bị quân sự do họ sản xuất, trong các công ty tham gia hội chợ có Tập đoàn Công Nghệ Bắc Trung Quốc, gọi tắt là NORINCO, và công ty đa công nghệ Poly Technologies của Bắc Kinh.
Eurosatory là một hội chợ triển lãm vũ khí chủ yếu của Châu Âu, được tổ chức mỗi hai năm một lần.
Đây được mô tả là hội chợ vũ khí lớn nhất thế giới đối với các loại vũ khí dùng trên bộ.

X-UA-Compatible: IE=edge

Cache-Control: public, max-age=299

Set-Cookie: SessionID=2846888876.20480.0000; path=/; Httponly; Secure

Content-Language: vi


markdown:
Đường dẫn truy cập
Tới nội dung chính
Tới điều hướng chính
Đi tới "Tìm"
Ngôn ngữ khác
Tìm
Tìm
Nghe
Xem
Trang chủ
Việt Nam
Hoa Kỳ
Biển Đông
Thế giới
Blog
Diễn đàn
Mục
Đời sống
Kinh tế
Khoa học
Sức khoẻ
Văn hoá
Thể thao
Giáo dục
Chuyên đề
BÊN KIA QUỐC LỘ: Tiếng Vọng Từ Nông Thôn Mỹ
Ngư Dân Việt và Làn Sóng Trộm Hải Sâm
Thượng đỉnh Mỹ-Việt 2017
30/4: Ngày ấy - Bây giờ
Trump - 100 Ngày Đầu
VOA 75 năm
Bầu cử Hoa Kỳ 2016
Xung đột và Ngoại giao ở Biển Đông
Obama thăm Việt Nam
Học tiếng Anh
Video
Đăng nhập Facebook
Thêm
VOA Vietnamese TV
Chương trình mới nhất
Sắp tới
07:00 - 07:30
Truyền hình vệ tinh VOA
Thêm
VOA Express
Phóng sự
Các chương trình khác
VOA Vietnamese Audio Tube
Chương trình mới nhất
VOA 4 giờ 30 sáng
Sắp tới
22:00 - 23:00
VOA 10 giờ khuya
04:30 - 05:00
VOA 4 giờ 30 sáng
Thêm
Chương trình 4 giờ 30 sáng
Chương trình 10 giờ khuya
Các chương trình khác
Tìm
Tìm
Trước
Kế tiếp
0
Tin mới
Trước
Kế tiếp
0
Trực tiếp
Việt Nam
Việt Nam xem xét việc hợp pháp hóa hôn nhân đồng tính
31/07/2012
Trên thế giới, chỉ có 11 quốc gia đã hợp pháp hóa hôn nhân đồng tính
Việt Nam đang xem xét việc hợp pháp hóa hôn nhân đồng tính và nếu như vậy thì Việt Nam sẽ trở thành nước Châu Á đầu tiên thông qua luật này.
Bộ Tư pháp Việt Nam cho biết họ sẽ xem xét để đưa ra quyết định về vấn đề này trong kế hoạch sửa đổi luật hôn nhân và gia đình Việt Nam.
Bộ trưởng Tư pháp Việt Nam cho rằng gần đây cộng đồng người đồng tính, song tính và chuyển giới Việt Nam có xu thế mở rộng, nhu cầu được kết hôn hoặc sống chung với nhau ngày càng tăng lên. Vì thế "xét về đảm bảo quyền tự do cá nhân thì việc kết hôn của những người cùng giới tính cần được công nhận".
Một bài viết của hãng thông tấn AP cho biết giới ủng hộ cho người đồng tính ở Việt Nam đã rất ngạc nhiên về loan báo này, và cho rằng thậm chí nếu luật này không được Quốc hội thông qua, việc các giới chức chính phủ đề cập đến điều đó cũng đã là một thắng lợi.
Nhiều người cho rằng việc Việt Nam xem xét hợp thức hóa hôn nhân đồng tính là một điều đáng ngạc nhiên vì Việt Nam có thành tích nghèo nàn về nhân quyền, và thường xuyên bị các phương Tây chỉ trích vì đã sách nhiễu và bỏ tù các nhà bất đồng chính kiến và những người tìm kiếm tự do tôn giáo.
Trong quá khứ, nhà nước coi tình dục đồng tính là một "tệ nạn xã hội" ngang tầm với tệ nạn mại dâm và nghiện ma túy.
Trên thế giới, chỉ có 11 quốc gia đã hợp pháp hóa hôn nhân đồng tính.
Đồng tính luyến ái bị coi là bất hợp pháp và bị trừng phạt bằng án tù ở nhiều nước tại Châu Á, đặc biệt là ở các nước Hồi giáo như Malaysia, Iran và Pakistan.
Tại Ấn Độ, đồng tính luyến ái chỉ được hợp pháp hóa từ năm 2009, trong khi hôn nhân đồng tính bị cấm. Trung Quốc hợp pháp hóa hoạt động tình dục đồng giới vào năm 1997 nhưng không cho phép hôn nhân đồng tính.
Nguồn: IBT, AP
Ý kiến của bạn
Hiển thị bình luận
Đang tải bình luận...
Liên quan
Bộ Ngoại giao Mỹ nhận định về tình hình tự do tôn giáo ở Việt Nam
Việt Nam y án 11 năm tù đối với Mục sư Nguyễn Công Chính
Ðại sứ Campuchia cáo buộc Việt Nam, Philippines chơi trò 'chính trị bẩn thỉu'
Bài xem nhiều nhất
1
Hình ảnh Thủ tướng Việt Nam gây tranh cãi
2
Người Mỹ gốc Việt lừa đảo ‘thẻ xanh’ lãnh án tù
3
Trump đưa vào sử dụng tàu chiến tối tân gần 13 tỉ đôla
4
Vì sao Trung Quốc ngưng xây dựng ở Quảng Châu?
5
Người Việt chi nhiều tỷ đôla 'tậu' nhà tại Mỹ
Ảnh/Video xem nhiều nhất
1
Hoa Kỳ thử nghiệm “siêu vũ khí” có một không hai
2
Tướng lãnh văng tục, đe dọa cảnh sát
3
Bắc Triều Tiên: Phạm tội tiểu hình bị xử tử
4
Tìm ra nguyên nhân gây rớt máy bay Myanmar
5
Thêm nhiều chỉ trích nhắm vào tướng về hưu mạt sát cảnh sát
Bình luận nhiều nhất
Không có mục nào
Recommended
Phóng Sự: Ngư Dân Việt và Làn Sóng Trộm Hải Sâm
Back to top
XS
SM
MD
LG
## Ý kiến của bạn
Hiển thị bình luận

Cache-Control: public, max-age=300


markdown:
[(The C# Station ADO.NET Tutorial)](https://yinyangit.wordpress.com/2011/08/04/ado-net-tutorial-lesson-05-working-with-disconnected-data%e2%80%93dataset-and-sqldataadapter/ado-net-dataset-dataadapter/)
Lesson này hướng dẫn cách làm việc với dữ liệu ngắt kết nối (disconnected data) với DataSet và SqlDataAdapter. Qua đó, bạn sẽ biết cách sử dụng DataSet, SqlDataAdapter và hiểu tại sao cần phải làm việc với disconnected data.
## Giới thiệu
Một DataSet là một đối tượng chứa dữ liệu trong bộ nhớ và có thể gồm nhiều bảng. DataSet chỉ chứa dữ liệu chứ không tương tác với nguồn dữ liệu. Thay vào đó, SqlDataAdapter sẽ được dùng để quản lý các kết nối với nguồn dữ liệu và cho chúng ta chế độ làm việc disconnected. SqlDataAdapter mở một kết nối chỉ khi cần thiết và đóng nó ngay sau khi tác vụ được hoàn thành. Ví dụ, SqlDataAdapter thực hiện các tác vụ sau, khi đổ dữ liệu vào DataSet:
- Mở kết nối
- Đổ dữ liệu vào DataSet (Fill)
- Đóng kết nối
Và thực hiện các công việc sau, khi cập nhật dữ liệu nguồn với thay đổi của DataSet:
- Mở kết nối
- Ghi thay đổi từ DataSet vào dữ liệu nguồn (Update)
- Đóng kết nối
Giữa hai thao tác Fill và Update, các kết nối với nguồn dữ liệu được đóng lại và bạn có thể tự do ghi, đọc dữ liệu với DataSet. Đây chính là cơ chế của mô hình làm việc với disconnected data. Bởi vì ứng dụng sẵn sàng kết nối khi cần thiết, ứng dụng trở nên dễ phát triển hơn.
Hai kịch bản minh họa cho lý do tại sao bạn cần làm việc với disconnected data: người dùng làm việc không cần kết nối mạng và giúp Web site dễ phát triển hơn. Hãy xem xét việc nhà kinh doanh cần dữ liệu của khách hàng trong khi họ đi công tác. Khi bắt đầu ngày, họ sẽ cần đồng bộ dữ liệu với database chính để lấy các thông tin cập nhật mới nhất. Trong suốt ngày hôm đó, họ sẽ thực hiện các thay đổi trên dữ liệu khách hàng hiện tại, thêm khách hàng mới, và nhập các hóa đơn mới. Điều này hợp lệ vì họ có nguồn dữ liệu khách hàng riêng và những người khác không thể thay đổi trên cùng dòng dữ liệu. Vào cuối ngày, nhà kinh doanh cập nhật sẽ kết nối vào mạng và cập nhật thay đổi cho tiến trình xử lý ban đêm.
Kịch bản khác là giúp Web site dễ phát triển hơn.Với một SqlDataReader, bạn phải trở lại database lấy dữ liệu mỗi khi xem một trang. Điều này yêu cầu một kết nối mới cho mỗi lần tải trang, nó sẽ ảnh hưởng lớn đến hiệu suất khi số lượng người dùng tăng lên. Một cách để khắc phục điều này là dùng DataSet, chỉ cần cập nhật một lần và lưu trong bộ nhớ tạm (cache). Mỗi yêu cầu tải trang sẽ kiểm tra cache và nạp dữ liệu (từ database) nếu nó không tồn tại hoặc lấy dữ liệu ra khỏi cache và hiển thị nó. Điều này giúp hạn chế truy xuất database và tăng hiệu suất cho ứng dụng của bạn.
Các trường hợp ngoại lệ cho kịch bản trên bao gồm các trường hợp bạn cần cập nhật dữ liệu. Bạn phải quyết định, dựa trên cách dữ liệu sẽ được dùng và chiến lược của bạn. Dùng disconnected data khi thông tin của bạn thường là read-only, nhưng hãy xem xét các giải pháp thay thế (như dùng đối tượng SqlCommand để cập nhật tức thời) khi bạn yêu cầu một vài thứ linh hoạt hơn. Cũng vậy, nếu số lượng dữ liệu quá lớn để lưu trong bộ nhớ, bạn sẽ cần dùng SqlDataReader để đọc dữ liệu.
## Tạo đối tượng DataSet
Không có gì đặc biệt khi tạo một DataSet. Bạn chỉ cần tạo một thể hiện mới, giống bất kì đối tượng nào:
DataSet dsCustomers = new DataSet();
Constructor của DataSet không yêu cầu tham số. Tuy nhiên có một overload chấp nhận một chuỗi đại diện cho tên của DataSet, được dùng nếu bạn cần
[serialize](https://yinyangit.wordpress.com/2011/06/02/net-serialization-and-deserialization-in-csharp/) dữ liệu thành XML. Bây giờ, ta có một DataSet rỗng và cần một SqlDataAdapter để nạp dữ liệu cho nó.
## Tạo một SqlDataAdapter
SqlDataAdapter chứa các lệnh SQL và đối tượng connection để đọc và ghi dữ liệu. Bạn khởi tạo nó với câu SQL select và đối tượng connection:
SqlDataAdapter daCustomers = new SqlDataAdapter(“select CustomerID, CompanyName from Customers”, conn);
Dòng mã trên tạo một đối tượng SqlDataAdapter,
*daCustomers*. Câu SQL select xác định dữ liệu nào sẽ được đọc vào DataSet. Đối tượng connection, *conn*, nên được khởi tạo từ trước, nhưng không được mở. Đó là công việc của SqlDataAdapter để mở và đóng connection khi phương thức Fill() và Update() được gọi.
SqlDataAdapter tất cả lệnh cần thiết để tương tác với dữ liệu nguồn. Dòng mã trên xác định câu lệnh select, nhưng không cho thấy câu lệnh insert, update và delete. Chúng sẽ được thêm vào SqlDataAdapter sau khi nó được khởi tạo.
Có hai cách để thêm các lệnh insert, update, delete: thông qua các property của SqlDataAdapter hoặc với một SqlCommandBuilder. Trong bài này, tôi sẽ cho bạn thấy cách dễ nhất để làm điều này với SqlCommandBuilder. Trong bài sau, tôi sẽ sử dụng các property của SqlDataAdapter, công việc này sẽ đòi hỏi nhiều bước hơn nhưng sẽ giúp bạn hiệu quả hơn cách làm việc của SqlCommandBuilder. Đây là cách để thêm các lệnh vào SqlDataAdapter với SqlCommandBuilder.
SqlCommandBuilder cmdBldr = new SqlCommandBuilder(daCustomers);
Lưu ý rằng dòng mã trên khởi tạo một đối tượng SqlCommandBuilder với constructor cần một tham số là SqlDataAdapter,
*daCustomers. *Điều này giúp SqlCommandBuilder biết đối tượng SqlDataAdapter nào để thêm các lệnh vào. SqlCommandBuilder sẽ đọc câu SQL select (lấy từ SqlDataAdapter), từ đó suy ra các lệnh insert, update và delete, sau đó gán các lệnh mới vào các property Insert, Update, Delete của SqlDataAdapter tương ứng.
Như tôi đề cập từ trước, SqlCommandBuilder có hạn chế. Nó làm việc khi bạn làm một câu select đơn giản trên một bảng. Tuy nhiên, khi bạn cần kết hợp hai hoặc nhiều bảng hoặc thực thi một stored procedure, nó sẽ không làm việc.
## Đổ dữ liệu vào DataSet
Để đổ dữ liệu vào DataSet bạn cần dùng phương thức Fill() của SqlDataAdapter, như sau:
daCustomers.Fill(dsCustomers, “Customers”);
Phương thức Fill(), trong dòng trên lấy hai tham số: một DataSet và một tên bảng. DataSet phải được tạo trước khi bạn đổ dữ liệu vào nó. Tham số thứ hai là tên của bảng sẽ được tạo trong DataSet. Bạn có thể đặt bất kì tên gì cho bảng. Thông thường, tôi sẽ để tên bảng trùng với tên gốc của nó trong database. Tuy nhiên, nếu câu select của SqlDataAdapter chứa một lệnh join, bạn sẽ cần phải đặt một tên rõ ràng khác cho bảng.
Phương thức Fill() có một overload chấp nhận một tham số là DataSet. Trong trường hợp này, bảng được tạo sẽ có tên mặc định là “table1” cho bảng đầu tiên. Số này sẽ tăng dần (table2, tabl3,…,tableN) cho mỗi bảng thêm vào DataSet nếu như tên bảng không được chỉ ra trong phương thức Fill().
## Sử dụng DataSet
Một DataSet sẽ gắn dữ liệu vào DataGrid của ASP.NET và Windows form. Đây là một ví dụ sẽ gán DataSet cho một Windows forms DataGrid:
dgCustomers.DataSource = dsCustomers;
dgCustomers.DataMember = “Customers”;
Điều đầu tiên chúng ta làm, trong đoạn mã trên, là gán DataSet cho property DataSource của DataGrid. Điều này giúp DataGrid biết nó có dữ liệu được gắn vào, tuy nhiên bạn sẽ thấy một dấu ‘+’ trên GUI bởi vì DataSet có thể giữ nhiều bảng và DataGrid cho phép bạn mở rộng ra để xem mỗi bảng trong đó. Để chỉ định bảng nào được dùng, gán property DataMember của DataGrid bằng tên của bảng. Trong ví dụ, chúng ta gán tên là
*Customers*, là tên trùng với tên trong tham số thử hai trong phương thức Fill() của SqlDataAdapter. Đây là lý do tôi thích đặt tên bảng trong phương thức Fill(), và nó giúp đoạn mã dễ đọc hơn.
## Cập nhật thay đổi
Sau khi thay đổi được thực hiện trên dữ liệu, bạn sẽ cần ghi lại vào database. Dòng mã sau cho thấy cách dùng phương thức Update của SqlDataAdapter để cập nhật các thay đổi vào database.
daCustomers.Update(dsCustomers, “Customers”);
Phương thức Update() trên được gọi trên thể hiện của SqlDataAdapter có tham số đầu tiên là chính đối tượng gọi phương thức. Tham số thử hai của phương thức Update() chỉ ra bảng nào trong DataSet sẽ được cập nhật. Bảng chứa một danh sách các dòng dữ liệu đã bị thay đổi và các property Insert, Update, Delete của SqlDataAdapter chứa các lệnh SQL dùng để thực hiện thay đối database.
## Kết hợp tất cả lại
Tới bây giờ, bạn đã thấy các phần cần thiết để quản lý disconnected data. Cái bạn cần là xem tất cả công việc trong một ứng dụng. Listing 1 cho thấy cách đoạn mã từ các phần trước được dùng trong một chương trình hoàn chỉnh:
##### Listing 1: Implementing a Disconnected Data Management Strategy
using System; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Windows.Forms; class DisconnectedDataform : Form { private SqlConnection conn; private SqlDataAdapter daCustomers; private DataSet dsCustomers; private DataGrid dgCustomers; private const string tableName = "Customers"; // initialize form with DataGrid and Button public DisconnectedDataform() { // fill dataset Initdata(); // set up datagrid dgCustomers = new DataGrid(); dgCustomers.Location = new Point(5, 5); dgCustomers.Size = new Size( this.ClientRectangle.Size.Width - 10, this.ClientRectangle.Height - 50); dgCustomers.DataSource = dsCustomers; dgCustomers.DataMember = tableName; // create update button Button btnUpdate = new Button(); btnUpdate.Text = "Update"; btnUpdate.Location = new Point( this.ClientRectangle.Width/2 - btnUpdate.Width/2, this.ClientRectangle.Height - (btnUpdate.Height + 10)); btnUpdate.Click += new EventHandler(btnUpdateClicked); // make sure controls appear on form Controls.AddRange(new Control[] { dgCustomers, btnUpdate }); } // set up ADO.NET objects public void Initdata() { // instantiate the connection conn = new SqlConnection( "Server=(local);DataBase=Northwind;Integrated Security=SSPI"); // 1. instantiate a new DataSet dsCustomers = new DataSet(); // 2. init SqlDataAdapter with select command and connection daCustomers = new SqlDataAdapter( "select CustomerID, CompanyName from Customers", conn); // 3. fill in insert, update, and delete commands SqlCommandBuilder cmdBldr = new SqlCommandBuilder(daCustomers); // 4. fill the dataset daCustomers.Fill(dsCustomers, tableName); } // Update button was clicked public void btnUpdateClicked(object sender, EventArgs e) { // write changes back to DataBase daCustomers.Update(dsCustomers, tableName); } // start the Windows form static void Main() { Application.Run(new DisconnectedDataForm()); } }
Phương thức Initdata() trong Listing 1 chứa các phương thức cần thiết để thiết lập SqlDataAdapter và DataSet. Lưu ý rằng các đối tượng dữ liệu khác nhau được định nghĩa tại cấp lớp vì thế chúng có thể được dùng trong nhiều phương thức. Property DataSource của DataGrid được gán trong constructor. Khi người dùng click nút Update, phương thức Update() trong sự kiện
*btnUpdateClicked*sẽ được gọi, cập nhật thay đổi vào lại database.
## Tổng kết
DataSet chứa nhiều bảng và có thể lưu trong bộ nhớ để tái sử dụng. SqlDataAdapter cho phép bạn đổ dữ liệu vào một DataSet và cập nhật thay đổi vào database. Bạn không cần lo lắng về việc mở và đóng SqlConnection bởi vì SqlDataAdapter tự động làm việc đó. Một SqlCommandBuilder tạo ra các câu lệnh insert, update, delete dựa trên câu select của SqlDataAdapter. Dùng phương thức Fill() của SqlDataAdapter để đổ dữ liệu vào DataSet. Gọi phương thức Update() của SqlDataAdapter để cập nhật thay đổi vào lại database.
Tôi hi vọng bạn thích bài này và mời bạn trở lại cho bài kết tiếp trong series này.
[Lesson 06: Thêm Parameter vào SqlCommand](https://yinyangit.wordpress.com/2011/08/05/ado-net-tutorial-lesson-06-adding-parameters-to-sqlcommands/).
———–
Nguồn tham khảo: http://www.csharp-station.com/Tutorials/AdoDotNet/lesson05.aspx
[https://yinyangit.wordpress.com](https://yinyangit.wordpress.com)
###### Related articles
[[ADO.NET Tutorial] Lesson 04: Đọc dữ liệu với SqlDataReader](https://yinyangit.wordpress.com/2011/08/03/ado-net-tutorial-lesson-04-reading-data-with-sqldatareader/) [[ADO.NET Tutorial] Lesson 03: Đối tượng SqlCommand](https://yinyangit.wordpress.com/2011/08/02/ado-net-tutorial-lesson-03-the-sqlcommand-object/) [[ADO.NET Tutorial] Lesson 02: Đối tượng SqlConnection](https://yinyangit.wordpress.com/2011/08/01/ado-net-tutorial-lesson-02-the-sqlconnection-object/) [[ADO.NET Tutorial] Lesson 01: Giới thiệu về ADO.NET](https://yinyangit.wordpress.com/2011/07/31/ado-net-tutorial-lesson-01-introduction-to-ado-net/)
Hi bác
Thế trong trường hợp máy khách đang làm việc mà mất điện thì sao ??
Chào bạn!
Điều này còn phụ thuộc vào ứng dụng có tự động lại lưu lại tiến trình công việc tự động không, không liên quan gì đến việc kết nối hay xử lý database.
Hi Yin Yang
Bạn cho hỏi cách code để có thể lưu lại tiến trình tự động như bạn đã nói ở trên.
Chân thành cám ơn
X Minh
Nếu cần thì bạn chỉ cần dùng 1 timer trong đó đơn giản là gọi phương thức lưu vào database.
Chào bạn!
Khi tôi xóa nhiều dòng dữ liệu trên Datagridview, ví dụ xóa 5 dòng dữ liệu, sau đó lại sửa dữ liệu ở dòng đầu tiên sau khi xóa và cuối cùng mới update xuống CSDL thì gặp 1 thông báo lỗi. Bạn gợi ý giúp tôi vấn đề này nha! Thanks!
Thông tin bạn cung cấp chưa đầy đủ nên mình chưa thể xác định được vấn đề của bạn. Có một cách giải quyết chung là bạn lấy dòng thông báo lỗi và tìm trên google. Đa số đều có thể tìm được lời giải đáp phù hợp.
Để xóa được nhiều dòng liên tiếp trên datagrid t đã dùng databinding để tự động thay đổi dữ liệu của datatable theo datagrid. Ví dụ nếu người dùng thực hiện liên tiếp 3 thao tác xóa, sửa, xóa ở dòng dữ liệu đầu tiên trên datagrid thì khi update xuống CSDL thì gặp báo lỗi. Lỗi này theo t hiểu là khi mình sửa dữ liệu ở dòng đầu tiên thì dòng đầu tiên sẽ được đánh dấu là updated, khi mình tiếp tục thực hiện xóa dữ liệu ở dòng đầu tiên thì sẽ lại update lại dữ liệu của datatable theo datagrid và đánh dấu dòng này là deleted. Vì thế nên khi update xuống CSDL thì dòng đầu tiên trên datatable sẽ được đánh dấu là updated và deleted nên sẽ xuất hiện thông báo lỗi.
Sử dụng databinding cho control, bạn có thể bắt các sự kiện thay đổi từ DataGrid hoặc BindingSource để gọi phương thức cập nhật vào database. Bạn cũng có thể thử dùng phương thức AcceptChanges() của DataTable hoặc DataRow trước khi thực hiện thay đổi mới. Như vậy các trạng thái được đánh dấu của DataRow sẽ trở về mặc định là unchanged.
Bạn có thể demo cụ thể đươc không Yin Yang. Thanks.
Giả sử bạn có phương thức lưu vào database là db.Save(). Bạn tạo một timer và trong sự kiện Tick, bạn chỉ cần gọi db.Save().
Nếu chưa biết cách sử dụng timer, bạn có thể tìm kiếm một số bài hướng dẫn trên mạng.
Hi Yin Yang
Bạn có thể demo giúp mình phần này cho 3 chức năng gồm: Insert, Update, Delete trên 02 table có quan hệ 1 – nhiều được không?
Thanks so much
Chào bạn, yêu cầu của bạn sẽ được đáp ứng trong một số bài viết sau.
Hi Yin Yang
Mình có làm demo cho trường hợp này với 2 table có quan hệ 1 – nhiều, trường hợp xóa dữ liệu thì không có vấn đề gì nhưng với trường hợp Thêm mới & Cập nhật thì lại xảy ra 1 vấn đề ở table con, nếu table con có nhiều hơn 1 record thì có data của 01 column của record thứ 2 hoặc thứ 3 không được đưa vào CSDL (tự động gán NULL vì mình cho phép NULL ở column này), trên giao diện ngay khi thực hiện xong vẫn thể hiện giá trị nhập vào đầy đủ nhưng trong CSDL 01 column của record thứ 2 hoặc thứ 3 không được ghi vào đó. Tất cả các thao tác này mình thực hiện đồng thời trên 2 table. Bạn Yin Yang có biết nguyên nhân vì sao ko? Bạn có thể giúp mình khắc phục nó được ko?
Bạn thử kiểm tra lại code và debug xem có chèn đầy đủ vào lệnh insert chưa? Nếu cột đó chỉ là cột dữ liệu thông thường thì có thể ko liên quan đến relationship.
Hi Yin Yang
Mình debug rồi, xem chi tiết bên trong SqlDataAdapter.Update(ds,tablename); thì thấy nó tạo chuỗi Insert đúng. Mình đang thắc mắc có phải chăng kiểu dữ liệu trong CSDL column đó mình định nghĩa là money trong khi dữ liệu lấy trên gridView control của DevExpress có thể là string nên trong lúc debug không nhìn thấy Size & Value được truyền vào, vậy mà nó vẫn Insert vào CSDL chỉ duy nhất 01 column của 01 hàng (trường hợp có nhiều hơn 01 hàng như đã nói ở comment trên ) bị NULL. Có nghĩa là nó chỉ insert được 01 hàng trọn vẹn trong bất kỳ trường hợp nào, còn trường hợp có nhiều hơn 01 hàng thì column có kiểu dữ liệu money lại bị NULL. Không biết phải sửa lại sao cho đúng nữa Yin Yang ui!
Đây là code để xử lý vấn đề này: Mình code ở event of button Update
SqlConnection cnn = new SqlConnection(GlobalVariable.WSInfo.ConnectionString);
SqlDataAdapter sqlda1 = new SqlDataAdapter(“SELECT * FROM KT1”, cnn);
SqlCommandBuilder cmdBldr1 = new SqlCommandBuilder(sqlda1);
SqlDataAdapter sqlda2 = new SqlDataAdapter(“SELECT * FROM KT2”, cnn);
SqlCommandBuilder cmdBldr2 = new SqlCommandBuilder(sqlda2);
DataTable dt; // data changed
// Case: Delete
dt = ds.Tables[“KT2”].GetChanges(DataRowState.Deleted);
if (dt != null) sqlda2.Update(ds, “KT2”);
dt = ds.Tables[“KT1”].GetChanges(DataRowState.Deleted);
if (dt != null) sqlda1.Update(ds, “KT1”);
// Case: Add new
dt = ds.Tables[“KT1”].GetChanges(DataRowState.Added);
if (dt != null) sqlda1.Update(ds, “KT1”);
dt = ds.Tables[“KT2”].GetChanges(DataRowState.Added);
if (dt != null) sqlda2.Update(ds, “KT2”);
// Case: Modify
dt = ds.Tables[“KT1”].GetChanges(DataRowState.Modified);
if (dt != null) sqlda1.Update(ds, “KT1”);
dt = ds.Tables[“KT2”].GetChanges(DataRowState.Modified);
if (dt != null) sqlda2.Update(ds, “KT2”);
Yin Yang xem có giúp được mình không nha!!! Thanks so much!
Vấn đề tương đối khó xác định, nếu được bạn có thể đưa source code để mình kiểm tra thử.
Hi Yin Yang
Bạn có thể giải thích rõ hơn cho mình hiểu về vài dòng code này được ko?
// 2. init SqlDataAdapter with select command and connection
daCustomers = new SqlDataAdapter(“select CustomerID, CompanyName from Customers”, conn);
// 3. fill in insert, update, and delete commands
SqlCommandBuilder cmdBldr = new SqlCommandBuilder(daCustomers);
// 4. fill the dataset
daCustomers.Fill(dsCustomers, tableName);
// write changes back to DataBase
daCustomers.Update(dsCustomers, tableName);
Tôi ko thấy việc truyền các dữ liệu cần thiết vào để có thể thực hiện Insert, Update hay Delete. Việc truyền câu lệnh select ở trên có ý nghĩa gì? Trong khi tôi hiều điều đó có nghĩa là ta đang muốn lấy data của 2 columns (CustomerID, CompanyName). Làm sao để biết được khi nào ta thực thi Insert, Update hay Delete?
Thanks!!!
– Như tên gọi của nó, dựa vào câu select được truyền vào, đối tượng SqlCommandBuilder sẽ tự động tạo ra các câu lệnh insert, delete, update.
– Dữ liệu được update ở đây chính là đối tượng dsCustomers, một DataAdapter có thể cập nhật database từ một DataTable hoặc DataSet. Tức là mọi thay đổi bạn thực hiện trong DataSet hay DataTable sẽ được cập nhật vào trong database qua phương thức Update().
– Thay vì tạo và gọi các câu lệnh insert, delete, update thì bạn nên thay đổi dữ liệu trên DataTable.
Hi Yin Yang
Mình nêu lại ý tưởng bài toán hôm trước post bên bài DataSet Part 1 nha, giờ đưa qua đây thấy hợp với chủ đề này hơn.
Mình có 2 tables ở CSDL01 có relation 1 – nhiều, tạm gọi là table A (cha), table B (con). Bài toán yêu cầu lấy data có ở A & B với điều kiện thời gian do user chọn – Fill lên gridView, sau đó nếu user nhấn Insert sẽ đưa về 2 tables C & D của CSDL2, data của A đưa vào C, data của B đưa vào D (dĩ nhiên C & D có relation 1 – nhiều, C là cha, D là con & A – C có tên column tương tự nhau, B – D cũng vậy).
Mình đang vướng ở chỗ Insert data ngược trở lại C & D, bởi vì khi dữ liệu được Fill vào DataSet.Tables[“C”] & DataSet.Tables[“D”] sẽ có tình trạng là 1 cha nhiều con hoặc 1 cha 1 con.
Ví dụ: Khi Fill vào dataset table C có 2 record mang ID là 01, 02 & table D có 3 record nhận ID 01 1 record, nhận ID 02 2 record. table C có 2 record mang ID là 01, 02 & table D có 4 record nhận ID 01 2 record, nhận ID 02 2 record…..
Đồng thời khi Insert tôi phải thay đổi ID khóa chính của A qua lại cho C là 01 string tự tăng, ví dụ: ABC@0001 nếu có trong C rùi thì tăng lên ABC@0002 … (cái này ko có gì để nói)
Cái khó ở đây là làm sao để Insert đồng thời đúng thứ tự data với nhau giống như tôi ví dụ bên trên ấy.
Yin Yang tham mưu giúp tôi xem làm cách nào để phân biệt chính xác thứ tự của chúng.
Nói lại cho rõ chỗ ví dụ, đó là ở ví dụ trên mới chỉ có 2 trường hợp cho 1 mốc thời gian được User chọn thôi nha Yin Yang, bài toán của mình có data khá lớn, có thể 100, 1000…record ở 1 mốc thời gian khi user chọn, số liệu thay đổi theo thời gian luôn. Ví dụ: ngày hôm nay có 100 record, ngày mai 200 record ….nhưng điều có mối quan hệ như đã nói ở trên.
Hy vọng Yin Yang giúp được !!!! Thanks so much!!!!
Nếu là như thế, bạn chỉ cần filldata cho table C trước, sau đó mới fill cho table B. Việc dữ liệu theo thứ tự nào phụ thuộc vào cách sắp xếp dữ liệu của bạn, thông thường là sẽ sắp xếp theo ID. Còn về phần thời gian thì mình nghĩ ko có gì phức tạp nếu như các table đã có sẵn một cột lưu thời gian.
YinYang cho mình hỏi là mình có 2 bảng
KhachHang(MaKH,,TenKH,DiaChi)
ChiTietDatHang(MaDatHang,MaKH,NgayDatHang)
Nó có quan hệ qua khóa MaKH mình muốn là khi mình có thay đổi gì ở bảng KhachHang như sửa,xóa thì MaKH ở bàng ChiTietDatHang cũng tự động thay đồi theo.Cảm ơn bạn nhé
Bạn có thể tạo relation và constraint cho hai table. Tham khảo bài sau:
ADO.NET – Cơ bản về DataSet (Part 2/2): DataRelation và Constraint
Hi Yin Yang
Bạn cho hỏi mình muốn thêm SqlTransaction vào cách dùng Disconnected Data với DataSet & SqlDataAdapter thì phải code ntn cho đúng để khi thực hiện thêm, xóa, sửa nếu có lỗi chương trình tự động RollBack. Bạn demo code giúp nhé! Thanks!!!
Bạn có thể lên mạng search ví dụ hoặc vào thẳng MSDN (có rất nhiều) và cũng đơn giản:
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.aspx
Hi Yin Yang
Link bạn cung cấp mình cũng đã search tìm hiểu rùi nhưng nó ko đúng với câu hỏi của mình rùi. Mình copy lại câu hỏi nha.
“Bạn cho hỏi mình muốn thêm
SqlTransaction vào cách dùng Disconnected Data với DataSet & SqlDataAdapterthì phải code ntn cho đúng để khi thực hiện thêm, xóa, sửa nếu có lỗi chương trình tự động RollBack. Bạn demo code giúp nhé! Thanks!!!”
Mình ko nghĩ là SqlTransaction lại có cách dùng riêng cho DataSet, tất cả đều thực hiện như nhau cả. Bạn từng làm thử chưa?
Bạn cho mình hỏi là mình có 2 DateTimeInput txtNgayDatHang,txtNgayGiaoHang để nhập ngày tháng năm,
trong CSDL mình có 2 field ngày đặt hàng ,ngày giao hàng set kiểu DateTime
Trong Properties của 2 cái trên mình set Format là Custom,Custom Format là dd/MM/yy
Đoạn lệnh mình Insert vào
Chi_Tiết_Đặt_Hàng.ChiTietDatHangPersistance.InsertData(txtMaKH.Text, txtSoLuongBinh21L.Text, txtSoLuongBinh1_5L.Text, txtSoLuongBinh0_5L.Text, txtNgayDatHang.Text, txtNgayGiaoHang.Text);
Nhưng khi insert thì nó bào lỗi
String was not recognized as a Valid DateTime
Thanks!
Mình nhầm Custom Format là dd/MM/yyyy chứ
Bạn có thể debug xem chuỗi insert vào có hợp lệ ko. TỐt nhất là nên convert từ string sang DateTime trước khi insert vào database.
Trong cái hàm InsertData thì mình chỉ truyền các đối số vào thôi,còn bên trong nó thì nó sẽ thực hiện Convert và insert vào database,nếu mình sửa thành txtNgayDatHang.value.ToShortDateString(),txtNgayGiaoHang.value.ToShortDateString(),thí nó Insert đc nhưng mà nó không theo định dạng mình muốn là dd/mm/yyyy mà nó theo mm/dd/yyyy
à mình đọc không kĩ tưởng bạn xài textbox, nếu đã có được giá trị datetime rồi thì khi chèn bạn hãy dùng property Value chứ ko nên xài kiểu string. Khi đã có giá trị DateTIme rồi thì việc hiển thị ra sao không quan trọng vì đã có sẵn các phương thức format rồi.
YinYang giúp mình cái phương thức làm sao insert vào CSDL để nó có định dạng là dd/MM/yyyy được k ,vì mình có thử sửa lại là txtNgayDatHang.value.toString(“dd/mm/yyyy”) thì nó vẫn báo lỗi
String was not recognized as a Valid DateTime
DateTime bạn cần chèn vào giữa hai kí tự # (ví dụ #1/1/2001#). Ngoài ra thì bạn nên dùng paramter, như vậy không cần phải quan tâm đến việc format DateTime.
bài viết của bạn rất hay
thankss bạn nhiều nhé
mình cũng thực hiện thao tác dữ lịêu bằng dataset tuy nhiên gặp 1 lỗi là khi Update thì database lại báo lỗi là “Database is locked” mình tìm hiểu rất nhiều topic khác nhưng vẫn chưa khắc phục đc lỗi này … hi vọng bạn có thể giúp mình tháo gỡ 🙂
Có thể là do có connection nào khác chưa được đóng sau khi sử dụng. Bạn kiểm tra lại nhé.
Pingback: [ADO.NET Tutorial] Lesson 04: Đọc dữ liệu với SqlDataReader | fishgold192
Yin Yang cho mình hỏi có cách nào trong C# đối với datatable cho kết quả giống câu SQL:
SELECT * FROM table WHERE field1 in (SELECT field1 FROM table WHERE field2 like *ABC*)
Mình làm được trong phần “()” như table.select(“field2 like *ABC*”), còn sử dụng kết quả này cho câu select trước mình không biết làm. Thanks
Thay vì dùng Select(), bạn có thể thay thế bằng Linq xem sao.

Vary: Cookie

X-hacker: If you're reading this, you should visit automattic.com/jobs and apply to join the fun, mention this header.

Link: <http://wp.me/ptl4u-y9>; rel=shortlink

X-ac: 1.dca _dca