在 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 中使用存储过程进行更新的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.net 中运行时调用存储过程

如何使用存储过程从 ASP.NET 记录计数?

用asp.net执行存储过程

Asp.Net 在运行存储过程时出现超时错误

执行sql脚本,不等待完成

如何在 asp.net 中使用绑定变量(在按钮后面)?