【发布时间】:2021-08-24 13:49:14
【问题描述】:
我有一个关于 SQL 存储过程的问题。我已将我的 SQL Server 数据库连接到我的 ASP.NET Web 窗体应用程序,并创建了一个使用存储过程在数据库中保存数据的按钮。
我只想在前端使用两个字段,即 Name 和 Surname。我不希望其他版主输入 Id(这是主键),因此存储过程必须在添加一些姓名和姓氏后自行递增。
但是,一旦将数据放入字段中,所有行都会填充该数据?
示例数据库。
| Id | Name | Surname |
|---|---|---|
| 1 | Alex | Smith |
| 2 | Bob | Phoenix |
| 3 | Correy | Lollas |
点击插入按钮后,我创建了填充姓名和姓氏(ID 应该自动递增)
| Id | Name | Surname |
|---|---|---|
| 1 | Test | Name |
| 2 | Test | Name |
| 3 | Test | Name |
存储过程,虽然我认为问题出在逻辑上。
ALTER PROCEDURE [dbo].[spOrders_Save]
@Id int = NULL,
@Name nvarchar(max),
@Surname nvarchar(max),
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS (SELECT * FROM tblOrders WHERE ([Id] = @Id OR @Id IS NULL) )
BEGIN
UPDATE tblOrders
SET
[Name] = @Name,
[Surname] = @Surname ,
WHERE ([Id] = @Id OR @Id IS NULL)
END
ELSE
BEGIN
INSERT INTO tblOrders
( [Name],
[Surname]
) VALUES
( @Name,
@Surname)
END
END
逻辑
protected void FormView_Orders_DataBound(object sender, EventArgs e)
{
// If we have no rows, then change the formview into insert mode otherwise we are updating an existing row.
if (this.ORDERS_rowCount == 0)
{
FormView_Orders.ChangeMode(FormViewMode.Insert);
for (int p = 1; p <= ORDERS_PAGE_COUNT; p++)
{
(FormView_Orders.FindControl("btSaveData_" + p.ToString()) as Button).CommandName = "insert";
}
}
else
{
FormView_Orders.ChangeMode(FormViewMode.Edit);
for (int p = 1; p <= ORDERS_PAGE_COUNT; p++)
{
(FormView_Orders.FindControl("btSaveData_" + p.ToString()) as Button).CommandName = "update";
}
}
}
我尝试解决的问题:
我尝试对 Id 进行硬编码,看看会发生什么。
令人惊讶的是,如果我运行localhost:1234/something.aspx?Id=4 然后输入详细信息,就会添加一个新行。所以我认为 C# 逻辑有问题?或者也许是存储过程?我知道前端没问题,因为它是自动化的。
| Id | Name | Surname |
|---|---|---|
| 1 | Alex | Smith |
| 2 | Bob | Phoenix |
| 3 | Correy | Lollas |
| 4 | Test | Name |
【问题讨论】:
-
我对 T-SQL 不太感兴趣,但看起来 id 总是为空。你有
WHERE ([Id] = @Id OR @Id IS NULL))并且在开始时你将 id 设置为 null。我不确定 id 将如何/何时改变,所以总是更新? -
是的,似乎每次运行提交时,当我打开 SQL Server Profiler 时,无论其他值如何,@Id 始终为 NULL。
-
所以我猜,搜索如何在 [your app-type] 的 sp 中设置 ID 的值。
-
非常感谢!我找到了一种方法,只需从两个地方删除 is null 并开始增加。
标签: c# sql asp.net sql-server