Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: sử dụng proc với C#?

  1. #1
    Ngày gia nhập
    10 2011
    Bài viết
    12

    Mặc định sử dụng proc với C#?

    Chào, cho GMX hỏi một chút về vấn đề này với nhé

    Khi mình sử dụng proc để thực hiện các thao tác với database thì có gì cần lưu ý khi gọi bên code ko ?

    Khi nào thì sử dụng execute scalar/reader/ non query với proc? Nếu có thể cho GMX xin source mẫu với được ko?
    > Nếu proc trả về kết quả là 0/1 (đúng/sai dùng khi login hoặc số lượng mẩu tin...) thì dùng execute loại nào? Cách truyền tham số trong trường hợp này ntn?
    > Nếu proc trả về kết quả là 1 bảng kết quả thì dùng execute loại nào (truy xuất thông tin)? Cách truyền tham số trong trường hợp này ntn?
    > Nếu mình dùng proc để insert/update/delete bảng thì dùng execute loại nào? Cách truyền tham số trong trường hợp này ntn?

    Cảm ơn mọi người nhiều nhé

  2. #2
    Ngày gia nhập
    12 2011
    Nơi ở
    vùng kín
    Bài viết
    139

    code trên mạng nhiều lắm bạn ơi. Mình chỉ nói sơ qua rồi bạn tự tìm hiểu nhé
    -sử dụng proc cũng giống như bạn sử dụng câu lệnh trực tiếp thôi, thay vì viết câu lệnh thì bạn sử dụng tên của proc mà bạn đã viết trong sql.
    chẳng hạn:
    Visual C# Code:
    1. SqlCommand dbCmd = new SqlCommand("tên proc", Opencon()))
    2.                 dbCmd.CommandType = CommandType.StoredProcedure;
    Opencon() là hàm mở Connection

    -execute scalar trả về kiểu object, sử dụng với cậu select trả về 1 giá trị đơn.
    -execute reader trả về kiểu sqldatareader , sử dụng trả về 1 tập giá trị.
    -execute non query trả về kiểu int sử dụng thực thi câu lệnh sql ko trả về 1 tập giá trị(delete, update,insert)

  3. #3
    Ngày gia nhập
    10 2011
    Bài viết
    14

    Trích dẫn Nguyên bản được gửi bởi GMXChaser Xem bài viết
    Chào, cho GMX hỏi một chút về vấn đề này với nhé

    Khi mình sử dụng proc để thực hiện các thao tác với database thì có gì cần lưu ý khi gọi bên code ko ?

    Khi nào thì sử dụng execute scalar/reader/ non query với proc? Nếu có thể cho GMX xin source mẫu với được ko?
    > Nếu proc trả về kết quả là 0/1 (đúng/sai dùng khi login hoặc số lượng mẩu tin...) thì dùng execute loại nào? Cách truyền tham số trong trường hợp này ntn?
    > Nếu proc trả về kết quả là 1 bảng kết quả thì dùng execute loại nào (truy xuất thông tin)? Cách truyền tham số trong trường hợp này ntn?
    > Nếu mình dùng proc để insert/update/delete bảng thì dùng execute loại nào? Cách truyền tham số trong trường hợp này ntn?

    Cảm ơn mọi người nhiều nhé
    1. Hạn chế viết tắt procedure là proc => Nó cũng là chữ viết tắt của process => Gọi tắt là sp hoặc sproc
    2. Xem biến output của SP bên code quản trị DB mà tạo biến xuất tuơng ứng bên code C#.
    3. Và vấn đề câu 2 là rất quan trọng, để xác định bạn dùng scalar, reader, nonquery.
    Biết biến output là gì mới sử dụng tương ứng, muốn biết công năng của từng loại execute thì chỉ cần rê chuột trên intellicense IDE lập trình C#.
    4. Công dụng của 3 loại execute trên:
    - Dùng NonQuery => Cho phép xuất kết quả với dạng 1 phần tử kiểu int => Dễ lỗi cast.
    - Dùng Scalar => Cho phép xuất kết quả với dạng 1 phần tử kiểu object => Không bao giờ lỗi cast.
    - Dùng Reader => Cho phép tìm và lấy ra 1 kết quả dưới dạng lưới => Xuất ra DataTable,...
    5. Các lệnh ADO.Net mà Scalar, NonQuery, Reader hoặt động:
    - Update, Delete, Insert: NonQuery(int), Scalar(object) => Nên dùng Scalar (TÍNH AN TOÀN PHẠM VI CAST).
    - Select ra kết quả là 1 phần tử kiểu int: NonQuery, Scalar
    - Select ra kết quả là 1 phần tử kiểu bất kỳ: Scalar
    - Select ra lưới:
    + Dùng NonQuery => Không lỗi nếu phần từ [0][0] của lưới kiểu int => Nhưng nó chỉ xất phần tử đó mà không xuất lưới.
    + Dùng Scalar => Không lỗi => Nhưng nó chỉ xuất phần tử [0][0] mà không xuất lưới.
    + Dùng Reader => Không lỗi => Có thể lấy ra 1 lưới tốt nhất => Nên dùng nó (TÍNH AN TOÀN PHẠM VI TRÍCH XUẤT DỮ LIỆU).

    => Như trên Phú đề cập tới 3 phạm vi an toàn, và thằng: NonQuery không nằm trong nào hết. => Nếu có thì nó nằm trong: WARNING CAST.
    ==> Rút lại công dụng như trên:

    - Select lưới với Reader.
    - Update, insert, delete, select 1 phần tử với Scalar.
    - Không nên dùng NonQuery bất cứ trường hợp nào.

  4. #4
    Ngày gia nhập
    05 2009
    Nơi ở
    Vinh city
    Bài viết
    157

    Trích dẫn Nguyên bản được gửi bởi yeucsharp Xem bài viết
    1. Hạn chế viết tắt procedure là proc => Nó cũng là chữ viết tắt của process => Gọi tắt là sp hoặc sproc
    2. Xem biến output của SP bên code quản trị DB mà tạo biến xuất tuơng ứng bên code C#.
    3. Và vấn đề câu 2 là rất quan trọng, để xác định bạn dùng scalar, reader, nonquery.
    Biết biến output là gì mới sử dụng tương ứng, muốn biết công năng của từng loại execute thì chỉ cần rê chuột trên intellicense IDE lập trình C#.
    4. Công dụng của 3 loại execute trên:
    - Dùng NonQuery => Cho phép xuất kết quả với dạng 1 phần tử kiểu int => Dễ lỗi cast.
    - Dùng Scalar => Cho phép xuất kết quả với dạng 1 phần tử kiểu object => Không bao giờ lỗi cast.
    - Dùng Reader => Cho phép tìm và lấy ra 1 kết quả dưới dạng lưới => Xuất ra DataTable,...
    5. Các lệnh ADO.Net mà Scalar, NonQuery, Reader hoặt động:
    - Update, Delete, Insert: NonQuery(int), Scalar(object) => Nên dùng Scalar (TÍNH AN TOÀN PHẠM VI CAST).
    - Select ra kết quả là 1 phần tử kiểu int: NonQuery, Scalar
    - Select ra kết quả là 1 phần tử kiểu bất kỳ: Scalar
    - Select ra lưới:
    + Dùng NonQuery => Không lỗi nếu phần từ [0][0] của lưới kiểu int => Nhưng nó chỉ xất phần tử đó mà không xuất lưới.
    + Dùng Scalar => Không lỗi => Nhưng nó chỉ xuất phần tử [0][0] mà không xuất lưới.
    + Dùng Reader => Không lỗi => Có thể lấy ra 1 lưới tốt nhất => Nên dùng nó (TÍNH AN TOÀN PHẠM VI TRÍCH XUẤT DỮ LIỆU).

    => Như trên Phú đề cập tới 3 phạm vi an toàn, và thằng: NonQuery không nằm trong nào hết. => Nếu có thì nó nằm trong: WARNING CAST.
    ==> Rút lại công dụng như trên:

    - Select lưới với Reader.
    - Update, insert, delete, select 1 phần tử với Scalar.
    - Không nên dùng NonQuery bất cứ trường hợp nào.
    Bạn yeucsharp sai rồi bạn àh. Trong 3 loại execute là NonQuery, Reader, Scalar, thì NonQuery được dùng phổ biến nhất, Reader ít được dùng nhất
    - Đối với update dữ liệu (thêm, sửa, xóa): luôn dùng NonQuery. NonQuery trả về số bản ghi được tác động (rows affected). Căn cứ vào kết quả trả về, bạn biết được số bản ghi mà câu lệnh truy vấn tác động lên. Nếu câu lệnh không lỗi, mà kết quả bằng 0, tức là không có bản ghi nào bị update cả
    - Đối với select dữ liệu:
    + Trường hợp trả về 1 tập dữ liệu: dùng Reader. Tuy nhiên, SqlReader là 1 loại dữ liệu chỉ đọc tuần tự, tức là bạn chỉ duyệt qua được nó 1 lần, nên nó cũng ít được dùng. Khi select 1 tập dữ liệu, người ta có xu hướng dùng SqlDataAdapter để Fill dữ liệu vào 1 DataSet hoặc 1 DataTable. Tuy tốc độ thực thi có chậm hơn, nhưng dữ liệu lại dễ dàng được xử lý, dễ dàng dùng làm DataSouce để Binding dữ liệu lên lưới (GridView)
    + Trường hợp trả về 1 giá trị đơn. Dùng Scalar. ExecuteScalar trả về cột đầu tiên của bản ghi đầu tiên của kết quả truy vấn, nên thích hợp cho những truy vấn trả về 1 giá trị đơn, như là Count, Sum, Average...
    Everytime you smile, I smile!

  5. #5
    Ngày gia nhập
    10 2011
    Bài viết
    14

    Trích dẫn Nguyên bản được gửi bởi giangcoi48k Xem bài viết
    Bạn yeucsharp sai rồi bạn àh. Trong 3 loại execute là NonQuery, Reader, Scalar, thì NonQuery được dùng phổ biến nhất, Reader ít được dùng nhất
    - Đối với update dữ liệu (thêm, sửa, xóa): luôn dùng NonQuery. NonQuery trả về số bản ghi được tác động (rows affected). Căn cứ vào kết quả trả về, bạn biết được số bản ghi mà câu lệnh truy vấn tác động lên. Nếu câu lệnh không lỗi, mà kết quả bằng 0, tức là không có bản ghi nào bị update cả
    - Đối với select dữ liệu:
    + Trường hợp trả về 1 tập dữ liệu: dùng Reader. Tuy nhiên, SqlReader là 1 loại dữ liệu chỉ đọc tuần tự, tức là bạn chỉ duyệt qua được nó 1 lần, nên nó cũng ít được dùng. Khi select 1 tập dữ liệu, người ta có xu hướng dùng SqlDataAdapter để Fill dữ liệu vào 1 DataSet hoặc 1 DataTable. Tuy tốc độ thực thi có chậm hơn, nhưng dữ liệu lại dễ dàng được xử lý, dễ dàng dùng làm DataSouce để Binding dữ liệu lên lưới (GridView)
    + Trường hợp trả về 1 giá trị đơn. Dùng Scalar. ExecuteScalar trả về cột đầu tiên của bản ghi đầu tiên của kết quả truy vấn, nên thích hợp cho những truy vấn trả về 1 giá trị đơn, như là Count, Sum, Average...
    Chào bạn, bạn hãy test thử Scalar và NonQuery lại. Rất nhiều nhiều bạn sinh viên luôn dùng NonQuery điều này không cần thiết. Ta có thể làm nó với Scalar và phạm vi cast lớn hơn nhiều vì nó là object. Câu lệnh insert, update, delete,... vẫn sử dụng được với Scalar
    CÔNG DỤNG GIỐNG NHƯ NONQUERY, NHƯNG PHẠM VI CAST LÀ ĐỈNH.
    => NonQuery sẽ bị loại nếu thấy công dụng thật sự của Scalar.

    p/s cho bạn: Tác giả của các tool phát sinh code 3 lớp luôn phát sinh ra NonQuery <= Nhược điểm lớn.

  6. #6
    Ngày gia nhập
    12 2010
    Bài viết
    99

    Mặc định sử dụng proc với C#?

    Bạn có thể ví dụ về scala sử dụng để insert , update , delete không ? Mình toàn dùng Nonquery để thực hiện tác vụ này .

  7. #7
    Ngày gia nhập
    10 2011
    Bài viết
    14

    Trích dẫn Nguyên bản được gửi bởi thvnhn Xem bài viết
    Bạn có thể ví dụ về scala sử dụng để insert , update , delete không ? Mình toàn dùng Nonquery để thực hiện tác vụ này .
    À thì bạn thay thế câu NonQuery thành Scalar, xem thử kết quả.

  8. #8
    Ngày gia nhập
    12 2010
    Bài viết
    99

    Trích dẫn Nguyên bản được gửi bởi yeucsharp Xem bài viết
    À thì bạn thay thế câu NonQuery thành Scalar, xem thử kết quả.
    Ý mình là cái bắt lỗi cast của nó ấy ?

  9. #9
    Ngày gia nhập
    05 2009
    Nơi ở
    Vinh city
    Bài viết
    157

    Trích dẫn Nguyên bản được gửi bởi yeucsharp Xem bài viết
    À thì bạn thay thế câu NonQuery thành Scalar, xem thử kết quả.
    Bạn có hiểu tác dụng của mỗi loại Execute không vậy:
    - ExecuteNonQuery: Executes a Transact-SQL statement against the connection and returns the number of rows affected.
    - ExecuteScalar: Executes the query, and returns the first column of the first row in the result set returned by the query.

    C# đã chú thích rõ ràng như thế. Giờ câu lệnh update bạn dùng scalar, thế thì bạn có biết được câu lệnh của bạn sẽ tác động lên bao nhiêu bản ghi không, hử? Còn dám chê các tool nữa chứ
    Everytime you smile, I smile!

  10. #10
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    dùng cái nào là tùy quan điểm, dùng ExecuteScalar lợi hơn hay không thì chưa chắc

    ExecuteScalar chủ ý là gọi một sp có dữ liệu trả về, đừng dùng ExecuteScalar cho cả trường hợp không có dữ liệu trả về, một hàm có thể làm nhiều việc không những không có lợi mà còn đánh mất tính cohesion của code

    hơn nữa khi bạn muốn gọi một sp update nhưng lúc code lại nhớ nhầm tên, điền vào tên của một sp select, khi đó nếu dùng ExcuteNonQuery, C# runtime "có thể" tung một exception giúp bạn nhận ra lỗi sớm hơn.

Các đề tài tương tự

  1. MS SQL với C# Stored proc không có Parameters truyền vào thì có nhanh hơn Stored proc có Parameters truyền vào
    Gửi bởi h034 trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 1
    Bài viết cuối: 17-12-2012, 10:37 PM
  2. Store Proc trong C#
    Gửi bởi tiennguyenqn1 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 4
    Bài viết cuối: 22-07-2012, 12:51 PM
  3. Database Gọi Store Proc trong Store Proc như thế nào?
    Gửi bởi leminh_005 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 03-08-2011, 10:04 AM
  4. Sử dụng Trigger và Proc như thế nào?
    Gửi bởi sadrain_49 trong diễn đàn Thắc mắc đại cương Database & Reporting
    Trả lời: 2
    Bài viết cuối: 03-03-2011, 11:04 PM
  5. Xây dựng Proc để truyền tham số trong ASM?
    Gửi bởi trần trân trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 6
    Bài viết cuối: 11-01-2010, 12:08 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn