在 ASP.NET 中使用存储过程进行更新
Posted
技术标签:
【中文标题】在 ASP.NET 中使用存储过程进行更新【英文标题】:Update using stored procedure in ASP.NET 【发布时间】:2018-08-02 11:07:28 【问题描述】:我在 SQL Server 中创建了一个存储过程,如果记录存在,它将更新表,否则它将向表中插入记录
这是存储过程的代码:
CREATE PROCEDURE [dbo].[insert_update]
(@sender VARCHAR(50),
@receiver VARCHAR(50),
@no INT,
@mas INT,
@sha INT,
@not INT,
@ever INT,
@love INT,
@tele INT)
AS
BEGIN
IF EXISTS (SELECT 1
FROM links
WHERE sender = @sender
AND receiver = @receiver
AND no = @no
AND mas = @mas
AND sha = @sha
AND not = @not
AND ever = @ever
AND love = @love
AND tele = @tele)
BEGIN
UPDATE links
SET sender = ISNULL(@sender, sender),
receiver = ISNULL(@receiver, receiver),
no = ISNULL(@no, no),
mas = ISNULL(@mas, mas),
sha = ISNULL(@sha, sha),
not = ISNULL(@not, not),
ever = ISNULL(@ever, ever),
love = ISNULL(@love, love),
tele = ISNULL(@tele, tele)
WHERE
sender = @sender
AND receiver = @receiver
END
ELSE
BEGIN
INSERT INTO links
VALUES (@sender, @receiver, @no, @mas, @sha, @not, @ever, @love, @tele)
END
END
如果记录已经存在,我现在只想更新几列,所以下面是代码:
sql.Open();
SqlCommand Cmd = new SqlCommand("insert_update", sql);
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Parameters.AddWithValue("@sender", Request.QueryString["sender"]);
Cmd.Parameters.AddWithValue("@receiver", Request.QueryString["reciever"]);
Cmd.Parameters.AddWithValue("@no", Request.QueryString["one".ToString()]);
Cmd.Parameters.AddWithValue("@mas", Request.QueryString["two".ToString()]);
Cmd.Parameters.AddWithValue("@sha", Request.QueryString["three".ToString()]);
Cmd.Parameters.AddWithValue("@not", Request.QueryString["four".ToString()]);
Cmd.Parameters.AddWithValue("@ever", Request.QueryString["five".ToString()]);
Cmd.Parameters.AddWithValue("@love", Request.QueryString["six".ToString()]);
Cmd.Parameters.AddWithValue("@tele", Request.QueryString["seven".ToString()]);
Cmd.ExecuteNonQuery();
sql.Close();
每当我尝试更新时,都会出现错误
过程或函数“insert_update”需要参数“@mas”,但未提供。
那么如何只更新几列呢?
【问题讨论】:
为什么要将字符串传递给 int 列? Bad habits to kick : declaring VARCHAR without (length) - 您应该始终为您使用的任何varchar
变量和参数提供长度。您的VARCHAR
类型的参数实际上将是恰好一个字符 长 - 不会再长了。您传入的任何字符串都会被静默截断 - 通常不是您想要的!尽快修复此问题
Typo alert:动词是to receive,名词是receiver(不是你的“receiver”拼错了好几次)
我建议有一个名为not
的专栏会在某个时候吸引您。此外,SqlCommand 是 IDisposable 的,因此应该在 using
块中。你可能想看看can we stop using AddWithValue。
【参考方案1】:
您必须更改stored procedure
定义,以便过程不应期望每个参数的值。我们可以在stored procedure
定义中为每个参数指定默认值,如下图-
create PROCEDURE [dbo].[insert_update]
(
@sender varchar=null,
@reciever varchar=null,
@no int=null,
@mas int=null,
@sha int=null,
@not int=null,
@ever int=null,
@love int=null,
@tele int=null
)......
【讨论】:
哇!有效。但是,不是更新,而是添加了一个新行。我想更新记录,以便将新值添加到列中的先前记录。例如我想这样做- Cmd.Parameters.AddWithValue("@no", no+ Request.QueryString["one".ToString()]); 看看你的 IF EXISTS 检查 - 你的 WHERE 子句检查太多了。看起来它应该只检查发件人和收件人,我认为这是识别行的原因以上是关于在 ASP.NET 中使用存储过程进行更新的主要内容,如果未能解决你的问题,请参考以下文章