【发布时间】:2016-09-06 15:47:01
【问题描述】:
我有这个网络应用程序,用户使用复选框列表和文本框在网络表单中输入数据以输入值和日期。然后使用存储过程将输入的这些值更新到数据库中。
使用存储过程时,webapp 可以正常工作,但如果我改用Update 语句,它会使用用户输入的值乘以数据库中选择的项目数来更新数据库。
例如,如果checkboxlist中有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();
}
}
}
【问题讨论】:
-
在更新查询中,如果数据库中已经有一个值,它会将用户输入的数字加上为选定的特定“Account_ID”设置的表中已有的数字。
-
您定义了两次参数 - 为什么会这样?是否有任何代码没有向我们展示
i被操纵的位置? -
@user1666620 或
DateTime.Now。 -
将循环移动到 con.Open/con.Close 语句中可能是个好主意,这样您也只使用一个连接。将您的 com 移到循环内,将您的 con 移到循环外。这样你就不会添加到同一个com,而是每次都创建一个新的
标签: c# asp.net sql-server stored-procedures