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

Đề tài: [Winform C#] Dùng StoreProcedure Insert và trả về khóa chính

  1. #1
    Ngày gia nhập
    05 2010
    Nơi ở
    Tp Hcm
    Bài viết
    49

    Mặc định [Winform C#] Dùng StoreProcedure Insert và trả về khóa chính

    Dear các bro,tớ muốn sau khi insert new record thì trả về khóa chính vừa mới insert để insert vào bảng thứ 2.Câu lệnh Store đây:
    Code:
    ALTER PROCEDURE [dbo].[SP_InsertSanPham]
    	(	
    		@KhuVucID numeric(18, 0),
    		@DonViTinhID numeric(18, 0),
    		@LoaiHangID	numeric(18, 0),
    		@HangSanXuat nvarchar(MAX),
    		@Model	nvarchar(MAX),
    		@DiemGiaoHang	nvarchar(MAX),
    		@ThongSoKhac	nvarchar(MAX)
    	)
    AS
    BEGIN
    	insert into tblSanPham values(@KhuVucID ,@DonViTinhID ,@LoaiHangID,	@HangSanXuat ,@Model,@DiemGiaoHang,	@ThongSoKhac)
    END
    Update: tìm được cách này thấy cũng hợp lý,mà khi mình gọi trong ứng dụng và test thì nó chưa gửi về cái ID đó được.Nó báo lỗi ngay chỗ ExecuteStoreProcedure,nói là thiếu tham số @SanPhamID,mình đã sửa lại và thêm @SanPhamID vào hàm Insert nhưng nó cũng không lấy dc SanPhamID
    Code:
    Procedure or Function 'SP_InsertSanPham' expects parameter '@SanPhamID', which was not supplied.
    Store trong SQL:
    Code:
    ALTER PROCEDURE [dbo].[SP_InsertSanPham]
    	(
    		
    		@KhuVucID numeric(18, 0),
    		@DonViTinhID numeric(18, 0),
    		@LoaiHangID	numeric(18, 0),
    		@HangSanXuat nvarchar(MAX),
    		@Model	nvarchar(MAX),
    		@DiemGiaoHang	nvarchar(MAX),
    		@ThongSoKhac	nvarchar(MAX),
    		@SanPhamID numeric(18, 0) output
    )
    AS
    BEGIN
    	insert into tblSanPham values(@KhuVucID ,@DonViTinhID ,@LoaiHangID,	@HangSanXuat ,	@Model	,	@DiemGiaoHang	,	@ThongSoKhac)
    	set @SanPhamID = SCOPE_IDENTITY()
    END
    
    
    declare @ID  numeric(18, 0)
    exec SP_InsertSanPham '1','1','1','1','1','1','1',@ID output
    
    print 'SP ID: '
    print @ID
    Class DataAccessHelper:
    Code:
      public int ExecuteStoredProcedure(string spName,string[] pNames,object[] pValues)
            {
                SqlConnection conn = GetConnection();
                conn.Open();
                //Khai báo và khởi tạo đối tượng Command với tham số tên thủ tục spName
                SqlCommand cmd = new SqlCommand(spName,conn);
                //Khai báo kiểu thủ tục
                cmd.CommandType = CommandType.StoredProcedure;
                //Khai báo tham số SqlParameter
                SqlParameter p;
                //Khởi tạo danh sách các tham số với các giá trị tương ứng
                for (int i = 0; i < pNames.Length; i++)
                {
                    p = new SqlParameter(pNames[i],pValues[i]);
                    cmd.Parameters.Add(p);
                }
                return cmd.ExecuteNonQuery();
            }
    Class SanPhamDAL:
    Code:
            public bool Insert(SanPham sp)
            {
                string spName = "SP_InsertSanPham";
                string[] pNames = { "@KhuVucID", "@DonViTinhID", "@LoaiHangID", "@HangSanXuat", "@Model", "@DiemGiaoHang", "@ThongSoKhac"};
                object[] pValues = { sp.KhucVucID,sp.DonViTinhID,sp.LoaiHangID,sp.HangSanXuat,sp.Model,sp.DiemGiaoHang,sp.ThongSoKhac};
    
                int count = db.ExecuteStoredProcedure(spName, pNames, pValues);
                return count > 0;
               
            }
    Class Business:
    Code:
       public bool Insert(SanPham sp)
            {
                return dal.Insert(sp);
            }
    frmUpdateSanPham:
    Code:
      private void btnLuu_Click(object sender, EventArgs e)
            {
                //MessageBox.Show(dateTimePickerThoiDiem.Value.ToShortDateString());
                if (cboDMH.SelectedIndex == -1)
                {
                    lblMessage.Text = "Bạn chưa chọn Danh Mục Hàng";
                }
                else if (cboKhuVuc.SelectedIndex == -1)
                {
                    lblMessage.Text = "Bạn chưa chọn Khu Vực";
                }
                else if (cboDVT.SelectedIndex == -1)
                {
                    lblMessage.Text = "Bạn chưa chọn Đơn Vị Tính";
                }
                else
                {
                    if (lblID.Text == "")
                    {
                        lblMessage.Text = "";
                        SanPham sp = new SanPham((decimal)cboKhuVuc.SelectedValue, (decimal)cboDVT.SelectedValue, (decimal)cboLH.SelectedValue, txtHSX.Text, txtModel.Text, txtDiemGiaoHang.Text, txtThongSo.Text);
                        if (spBLL.Insert(sp)) 
                        {
                            MessageBox.Show(sp.SanPhamID.ToString());
                            MessageBox.Show("Thêm mới thành công", "Thông Báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            this.Close();
                        }
                       
                    }
                    else
                    {
                        lblMessage.Text = "";
                        SanPham sp = new SanPham(id, (decimal)cboKhuVuc.SelectedValue, (decimal)cboDVT.SelectedValue, (decimal)cboLH.SelectedValue, txtHSX.Text, txtModel.Text, txtDiemGiaoHang.Text, txtThongSo.Text);
                        spBLL.Update(sp);
                        MessageBox.Show("Cập nhật thành công", "Thông Báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Close();
                    }
    
                }
    
            }
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi huynhthoaianh : 18-01-2013 lúc 11:04 AM.

  2. #2
    Ngày gia nhập
    10 2009
    Nơi ở
    gầm cầu
    Bài viết
    156

    (hoa mắt) bạn xây mê cung cho người tham quan lọt vào chăng

  3. #3
    Ngày gia nhập
    05 2010
    Nơi ở
    Tp Hcm
    Bài viết
    49

    Trích dẫn Nguyên bản được gửi bởi doveandrose Xem bài viết
    (hoa mắt) bạn xây mê cung cho người tham quan lọt vào chăng
    mình làm theo mô hình 3 lớp nhìn hơi rối tí

  4. #4
    Ngày gia nhập
    10 2009
    Nơi ở
    gầm cầu
    Bài viết
    156

    câu hỏi đưa lên đây ko phải ai cũng đủ kiên nhẫn để xem hết nội dung mà những kiểu đưa code dài thăm thẳm trái đất như này người ta càng ko xem bạn ah` .
    góp ý thôi
    hỏi thì đưa trọng tâm câu hỏi thôi . Code ngắn gọn .
    thí dụ :
    Insert xuống CSDL có 1 cột mang giá trị mặc định là Int INDENTITY . Nhưng bây giờ có nhu cầu muốn lấy dc giá trị cột đó lên để xài thì phải làm sao ? . Thế thôi . Chứ ai lại đem cả mớ Code mê cung đó lên .Nếu tớ có hiểu sai ý bạn thì cũng chịu thôi vì chả đọc mớ Code của bạn làm gì cả

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

    - Nếu khóa chính là tự tăng (INDENTITY ) thì thêm:
    Code:
    Select @@IDENTITY
    vào cuối thủ tục Insert của bạn.
    - Nếu không phải tự tăng: Select luôn parameter khóa bạn truyền vào
    Code:
    select @SanPhamID

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

  1. Database với C# Insert dữ liệu vào bảng có chứa khóa ngoại lỗi The INSERT statement conflicted with the FOREIGN KEY constraint?
    Gửi bởi smile_on_sad trong diễn đàn Thắc mắc đại cương Database & Reporting
    Trả lời: 2
    Bài viết cuối: 25-05-2013, 06:13 PM
  2. ADO.NET [Winform C#] Cách bắt lỗi trùng record trong SQL khi insert với khóa chính tự tăng ?
    Gửi bởi anhht1005 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 27-03-2013, 09:33 AM
  3. INSERT ảnh vào CSDL trong C# Winform?
    Gửi bởi thuanchinapro07 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 08-07-2011, 01:38 AM
  4. Hiện thông báo lỗi từ StoreProcedure trong SQL ra winform
    Gửi bởi nhatnghe_thuong trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 01-05-2011, 10:25 PM
  5. Lệnh select trong StoreProcedure dùng bằng C#
    Gửi bởi devil0604 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 18-04-2009, 08:02 PM

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