使用存储过程与使用查询语句时产生正确结果的问题

本文关键字:问题 结果 存储过程 查询 语句 | 更新日期: 2023-09-27 18:05:58

我有这个web应用程序,用户在使用复选框列表和文本框输入值和日期的web表单中输入数据。然后使用存储过程将输入的这些值更新到数据库中。

当使用存储过程时,web应用程序正常工作,但是如果我使用Update语句,它将使用用户输入的值乘以数据库中选择的项数来更新数据库。

例如,如果复选框列表中有11个项目,所有项目都被选中,对于存储过程,如果用户输入12,数据库中的每个值将是12,但是使用更新语句,输入的每个值将是132,谁能向我解释为什么会这样做,如果有一种方法可以获得与存储过程相同的结果?

CREATE TABLE AccountTable
(
    RowID int IDENTITY(1, 1),
    AccountID varchar(2),
    AccountName varchar(50),
    SeqNum int,
    SeqDate datetime
)
CREATE PROCEDURE [ACCOUNTTABLE_UPDATE]
    (@SeqNum int,
     @SeqDate datetime,
     @Account_ID varchar(2)
    )
AS 
    SET NOCOUNT ON
    BEGIN
        UPDATE AccountTable
        SET SeqNum = SeqNum + @SeqNum, SeqDate =  @SeqDate
        WHERE AccountID = @AccountID
   END
c#代码:

DateTime dt = DateTime.Now;
DateTime.TryParseExact(datepicker.Text, "mmddyyyy", provider, style out dt);
int i = Int32.Parse(TextBox1.Text);
//DropDownList Binded from database values in another method
SqlConnection con = new SqlConnection(GetConnString());
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "[dbo].[Table_Update]";
//Update Query cmd.CommandText = "Update Account Table SET SeqNum = SeqNum + @SeqNum, SeqDate = @SeqDate WHERE AccountID = @AccountID;";
cmd.Parameters.AddWithValue("@SeqNum", SqlDbType.Int).Value = i
cmd.Parameters.AddWithValue("@SeqDate",SqlDbType.DateTime).Value = DateTime.Now;
cmd.Parameters["@Account_ID", SqlDbType.VarChar).Value = CheckBoxList1.SelectedValue;
foreach (ListItem item in CheckBoxList.Items)
{
     if (item.Selected)
     {
         cmd.Parameters["@SeqNum"].Value = i;
         cmd.Parameters["@SeqDate"].Value = DateTime.Now;
         cmd.Parameters["@Account_ID"].Value = item.Value;
          try
          {
             con.Open();
             cmd.ExecuteNonQuery();
          }
          catch (SqlException ex)
          {
              Response.Write(ex.Message);
              //Database Exceptions
          }
          finally
          {
              con.Close();
          }
     }
}

使用存储过程与使用查询语句时产生正确结果的问题

如何:

 public void data2()
    {
        DateTime dt = DateTime.Now;
        DateTime.TryParseExact(datepicker.Text, "mmddyyyy", provider, style out dt);
        int i = Int32.Parse(TextBox1.Text);
        int check = 0;
        //DropDownList Binded from database values in another method
        foreach (ListItem item in CheckBoxList.Items)
        {
            if (item.Selected)
            {
                check++;
            }
        }
        using (SqlConnection conn = GetConnString())
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand())
            {
                //    cmd.CommandType = CommandType.StoredProcedure;
                //cmd.CommandText = "[dbo].[Table_Update]";
                cmd.CommandText = "Update Account Table SET SeqNum = SeqNum + @SeqNum, SeqDate = @SeqDate WHERE AccountID = @AccountID";
                cmd.Parameters.AddWithValue("@SeqNum", check);
                cmd.Parameters.AddWithValue("@SeqDate", DateTime.Now);
                cmd.Parameters["@Account_ID", CheckBoxList1.SelectedValue);
                cmd.ExecuteNonQuery();
            }

            conn.Close();
        }
    }

或TextBox1。文本已经是你想要保存的数字…

    public void data3()
    {
        DateTime dt = DateTime.Now;
        DateTime.TryParseExact(datepicker.Text, "mmddyyyy", provider, style out dt);
        int i = Int32.Parse(TextBox1.Text);
                    //DropDownList Binded from database values in another method
        using (SqlConnection conn = GetConnString())
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand())
            {
                //    cmd.CommandType = CommandType.StoredProcedure;
                //cmd.CommandText = "[dbo].[Table_Update]";
                cmd.CommandText = "Update Account Table SET SeqNum = SeqNum + @SeqNum, SeqDate = @SeqDate WHERE AccountID = @AccountID";
                cmd.Parameters.AddWithValue("@SeqNum", TextBox1.Text);
                cmd.Parameters.AddWithValue("@SeqDate", DateTime.Now);
                cmd.Parameters["@Account_ID", CheckBoxList1.SelectedValue);
                cmd.ExecuteNonQuery();
            }

            conn.Close();
        }
    }

注意,在这两种情况下,因为你的SQL包含"SeqNum = SeqNum + @SeqNum",它将保存多少图片的运行总数,将这些选择在这里添加到任何选择之前。如果你不想这样做,修改你的SQL为"SeqNum = @seqNum",它将修改为仅在此页面加载期间选择的数字。