使用存储过程与使用查询语句时产生正确结果的问题
本文关键字:问题 结果 存储过程 查询 语句 | 更新日期: 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",它将修改为仅在此页面加载期间选择的数字。