Member 14185275 Ответов: 2

Как написать единую хранимую процедуру для вставки и обновления.


Я беру одну кнопку для вставки записей, а также для обновления записей.Я также взял скрытое поле, так как после нажатия этой кнопки, если скрытое поле равно нулю,то запись должна быть вставлена с заданными новыми значениями,А если скрытое поле не равно нулю, значит, уже есть идентификатор, то запись должна быть обновлена с измененными значениями.

Что я уже пробовал:

DAL:
 public void save_Click(int pid, string pname, string desc, int qnty, decimal pric)
    {
        SqlCommand cmd = new SqlCommand("SPSAVEDATA", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@P_id", pid);
        cmd.Parameters.AddWithValue("@P_name", pname);
        cmd.Parameters.AddWithValue("@P_desc", desc);
        cmd.Parameters.AddWithValue("@P_qty", qnty);
        cmd.Parameters.AddWithValue("@P_price", pric);
        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();
    }

BAL:
 public void Product(int pid, string pname, string desc, int qnty, decimal pric)
    {
        dll.save_Click(pid, pname, desc, qnty, pric );
    }

CS:
protected void Btn_save_Click(object sender, EventArgs e)
{
    if (HiddenField1.Value == "")
    {
        bll.Product(txt_proName.Text,txt_ldesc.Text,Convert.ToInt32(txt_qnty.Text),                             Convert.ToDecimal(txt_price.Text));
        Response.Write("<script>alert('Product Added Successfully')</script>");
    }
    else
    {
 bll.Product(Convert.ToInt16(HiddenField1.Value), txt_proName.Text,  txt_ldesc.Text, Convert.ToInt32(txt_qnty.Text), Convert.ToDecimal(txt_price.Text));
        }         
        Response.Write("<script>alert('Product Updated Successfully')</script>");
    }
    GridView1.DataSource = bll.LoadProduct();
    GridView1.DataBind();

}

Stored Procedure

CREATE PROC SPSAVEDATA
@P_id int,
@P_name varchar(50),
@P_desc varchar(400),
@P_qty int,
@P_price money
AS 
BEGIN 
if(@P_id=0)
BEGIN
insert into Products1 (P_name,P_desc,P_qty,P_price) values (@P_name,@P_desc,@P_qty,@P_price) 
END  
ELSE
BEGIN
update Products1 set P_name=@P_name,P_desc=@P_desc,P_qty=@P_qty,P_price=@P_price where P_id=@P_id
END  
END


я попробовал приведенный выше код, но не смог получить ожидаемых результатов.

2 Ответов

Рейтинг:
19

Richard Deeming

Цитата:
public void Product(int pid, string pname, string desc, int qnty, decimal pric)
...
bll.Product(txt_proName.Text, txt_ldesc.Text, Convert.ToInt32(txt_qnty.Text), Convert.ToDecimal(txt_price.Text));

Ваш Product метод ожидает пять параметров. Вы передаете только четыре параметра.


Member 14185275

Я передаю 4 параметра, потому что id я не могу передать, он будет автоматически сгенерирован для новых записей.

Richard Deeming

И, как я уже сказал, ваш метод объявлен как принятие ПЯТЬ параметры.

Вы не можете вызвать метод, который ожидает ПЯТЬ параметры, если вы только передадите ЧЕТЫРЕ параметры.

Основываясь на вашей хранимой процедуре, вам нужно пройти 0 в качестве первого параметра для вставки.

Member 14185275

Спасибо Ричарду, за ваш ответ
Я передам ноль вместо идентификатора и проверю, принимает он или нет

Member 14185275

Спасибо тебе Ричард,
это сработало для меня, thanx много

Рейтинг:
0

Tony Hill

CREATE PROC SPSAVEDATA
	@P_id int,
	@P_name varchar(50),
	@P_desc varchar(400),
	@P_qty int,
	@P_price money
AS 
BEGIN 
	UPDATE Products1 SET P_name=@P_name,
						 P_desc=@P_desc,
						 P_qty=@P_qty,
						 P_price=@P_price
						 WHERE P_id=@P_id
	
	IF (@@ROWCOUNT = 0)
	BEGIN
		INSERT INTO Products1 (P_name,P_desc,P_qty,P_price) 
		VALUES (@P_name,@P_desc,@P_qty,@P_price) 
	END
END

I prefer to use this pattern because a record is only inserted once but could be updated many times therefore it makes sense to assume that you will be updating the record.

If after attempting the UPDATE operation the @@ROWCOUNT = 0 it means it could not find a record to update there it will perform an INSERT operation.


Member 14185275

Привет Тони, танкс за ответ
Я проверю эту хранимую процедуру один раз и обновлю ее