如何将用户输入作为存储过程 C#、.NET 4.8 ASP.NET MVC 和 SQL Server 的变量传递

How can I pass a user input as a variable for a stored procedure C#, .NET 4.8, ASP.NET MVC, SQL Server

提问人:CodeHopperComeT 提问时间:9/20/2023 最后编辑:CodeHopperComeT 更新时间:9/28/2023 访问量:62

问:

我是很新的,想把这个项目作为一种实践,但我一辈子都无法弄清楚这一点。该项目是使用 C#、.NET Framework ASP.NET MVC 和 Microsoft SQL Server 生成的。

项目应该能够接受用户输入(“OrderNumber”)并将其作为变量传递给存储过程。该过程检查数据库中是否存在具有该订单号的表中的行。如果未找到,则会引发错误,如果找到错误,则会检查另一列名为“ScanStatus”。如果为 1,则给出错误“已扫描”,如果为 0,则更新为 1。我不能让它为我的生活工作,但这是下面的代码。任何帮助将不胜感激。

这是控制器

using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using System.Data;
using WebApplication1.Models;

namespace WebApplication1.Controllers
{
    public class ScanController : Controller
    {
        private static void UpdateScanStatus(bool Scan_Status, string connectionString)
        {
            //Update the Scan_Status Column 
            string commandText = "UPDATE SpeedPassBd.Orders SET Scan_Status = @scan_status" + "WHERE Order_Number = @Onumber;";
            string xmlData = "<Orders><ID>''</ID><Order_Number>@Order_Number</Order_Number><Customer_Name>''</Customer_Name><Scan_Status>@scan_status<Scan_Status><QR_Number>''</QR_Number></Orders>";

            using (SqlConnection connection = new SqlConnection("Data Source=SBSQL;User ID=SpeedPass;Password=********;Connect Timeout=30;Encrypt=False;Trust Server Certificate=False;Application Intent=ReadWrite;Multi Subnet Failover=False"))
            {
                SqlCommand command = new SqlCommand(commandText, connection);
                command.Parameters.Add("@scan_status", SqlDbType.Bit);
                command.Parameters[@scan_status].Value = Scan_Status;

                //Use AddWithValue to assign OrderNumber
                //SQL server will implicitly convert strings to XML.
                command.Parameters.AddWithValue("@Order_Number", xmlData);

                try
                {
                    connection.Open();
                    Int32 rowsAffected = command.ExecuteNonQuery();
                    Console.WriteLine("RowsAffected: {0}", rowsAffected);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
        
    }
}

这是模型类:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Web; 
  
namespace SpeedPass.Models 
{ 
     public class Orders 
     { 
         [Key] 
         public string Order_Number { get; set; } 
  
         [Required] 
         public string Customer_Number { get; set; } 
  
         [Required] 
         public bool Scan_Status { get; set; } 
     } 
}

这是 DbContext

using System; 
using SpeedPass.Models; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Linq; 
using System.Web; 
 
namespace SpeedPass.Data 
{ 
     public class SpeedPassDbContext : DbContext 
     { 
         public SpeedPassDbContext() : base("Data Source=SBSQL\\SB_SANDBOX_DB;Initial Catalog=testDB;Integrated Security=True;Connect Timeout=30;Encrypt=False;Trust Server Certificate=False;Application Intent=ReadWrite;Multi Subnet Failover=False") 
         { 
         } 

         public DbSet<Orders> Orders { get; set; } 
         public DbSet<Customers> Customers { get; set; } 
     } 
} 

这是存储过程

Use [testDB]
GO

SET ANSI_NULL ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[UpdateScanStatus]
    @OrderNumber varchar(8)
AS
BEGIN
    IF EXISTS (SELECT 1 FROM Orders WHERE Order_Number = @OrderNumber)
Begin
    DECLARE @ScanStatus BIT;
    SELECT @ScanStatus = ScanStatus
    FROM Orders
    WHERE Order_Number = @Order_Number

    IF @ScanStatus = 1
    BEGIN
        RAISERROR('Order is already scanned!', 23,1);
    END
    ELSE
    BEGIN
        UPDATE Orders
        SET Scan_Status = 1
        WHERE Order_Number = @OrderNumber
        
        PRINT 'Successful!';
        END
    END
    ELSE
    BEGIN

        RAISERROR('Order does not exist!'22,1);
    END
END;

我想在这里提供更多信息,尽管作为新手,我不知道该探索什么。我查看了 Microsoft 文档、C# 角和其他一些使用不同版本框架以及使用脚手架工具的网站。到目前为止,几乎都是反复试验。存储过程用于查找和更新数据库列以及错误处理。

C# sql-server asp.net-mvc . net-4.8

评论

0赞 Naveen J 9/20/2023
调试时,是否能够到达断点?Ordr_Number
0赞 Xedni 9/20/2023
您指的是什么存储过程?我看到了对的调用,但这实际上并不是在调用存储过程;它只是访问 .如果您真的打算调用存储过程,我认为这里不会发生这种情况。db.Orders.FirstOrDefaultDbSet
0赞 CodeHopperComeT 9/21/2023
@naveen我什至不知道我将如何调试它。你知道任何教你如何调试的资源吗?也给我一些时间,我会为你获取存储过程。它被称为“UpdateScanStatus”。对不起,我遗漏了
0赞 CodeHopperComeT 9/21/2023
在问题@naveen中添加了程序
1赞 Panagiotis Kanavos 9/21/2023
该存储过程不是很有用。您已经加载了订单,只需检查其状态并在需要时进行修改即可。整个存储过程可以替换为单个 .没有理由搜索订单两次,或者在找不到匹配的记录时引发错误。UPDATE ... WHERE OrderNumber=@order AND Status!=1

答: 暂无答案