【问题标题】:Why won't my stored procedure access more than one table?为什么我的存储过程不能访问多个表?
【发布时间】:2020-07-08 02:28:52
【问题描述】:

我正在使用 ASP.NET 和 SQL Server 并在 Visual Studio 中构建整个项目。如果不清楚我正在尝试使用用户用户名所在的随机生成的数字更新用户表,然后将日期、用户 ID 和 orderid 以及用户 ID 插入到 Orders 表中。

我看不出这有什么问题。我收到无法将空值放入非空列 (id) 的错误,但它似乎根本无法访问用户表。它不会将当前订单存储在用户中,但会生成orderId 并将其与日期一起放入订单中。

我想也许存储过程一次只能访问一个表,或者在某个地方我需要指定我需要访问哪些表。我的连接字符串有什么问题吗?

Asp.net:

public partial class PlaceOrder : System.Web.UI.Page
{
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["YIKESConnectionString"].ConnectionString);

    protected void Page_Load(object sender, EventArgs e)
    {
        string Name = Request.QueryString["Username"]; // retrieving username from the login page
        DateTime now = DateTime.Now;    // getting current date

        SqlCommand cmd = new SqlCommand("dbo.CreateOrder", con);
        con.Open();

        cmd.Parameters.Add("@Username", SqlDbType.VarChar).Value = Name;
        cmd.Parameters.Add("@DateOrdered", SqlDbType.Date).Value = now;
        cmd.Parameters.Add("@retord", System.Data.SqlDbType.Int).Direction = System.Data.ParameterDirection.ReturnValue;//return parameter
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.ExecuteNonQuery();   // isn't accessing users at all, try one procedure for users one of orders
        con.Close();

        int orderid = (int)cmd.Parameters["@retord"].Value;
    }
}

SQL Server 存储过程:

CREATE PROCEDURE [dbo].[CreateOrder]
    @DateOrdered date,
    @Username varchar(16)
AS
    DECLARE @CurrentOrder int
    DECLARE @retord int

    SELECT @CurrentOrder = FLOOR(RAND() * (10000 - 0 + 1) + 0);

    UPDATE Users
    SET Users.CurrentOrder = @CurrentOrder
    WHERE Users.Username = @Username;

    INSERT INTO Orders(Orders.Id)
        SELECT Users.Id
        FROM Users
        WHERE Users.Username = @Username;

    INSERT INTO Orders(OrderId, DateOrdered)
    VALUES (@CurrentOrder, @DateOrdered);

    SELECT @retord = @CurrentOrder

    RETURN @retord

编辑

收到反馈后,我测试了用户名是否在页面之间传递,并且传递为 2?我在这里做错了什么

传递用户名

Response.Redirect("AccessDatabase.aspx?Username=" + usertxt.Text);

检索用户名

string Name = Request.QueryString["Username"];

【问题讨论】:

  • 您使用的是哪个 dbms? (该代码是特定于产品的。)
  • 听起来您将 @Username 传递为 null。这可以解释这种行为。希望这会有所帮助:)

标签: c# asp.net sql-server visual-studio


【解决方案1】:
CREATE PROCEDURE [dbo].[CreateOrder]
@DateOrdered date,
@Username varchar(16)
AS
Begin
DECLARE @CurrentOrder int
DECLARE @retord int

SELECT @CurrentOrder = FLOOR(RAND()*(10000-0+1)+0);

UPDATE Users
SET Users.CurrentOrder = @CurrentOrder
WHERE Users.Username = @Username;

INSERT INTO Orders(Orders.Id)
SELECT Users.Id
FROM Users
WHERE Users.Username= @Username;

INSERT INTO Orders(OrderId, DateOrdered)
VALUES (@CurrentOrder, @DateOrdered);`enter code here`

SELECT @retord = @CurrentOrder
RETURN @retord
End

尝试使用 BEGIN.....END。

【讨论】:

    【解决方案2】:

    根据我的测试,我找到了解决方案。我们需要在完整参数中使用插入语句。

    你可以参考正确的存储过程。

    CREATE PROCEDURE [dbo].[CreateOrder]
        @DateOrdered date,
        @Username varchar(16)
    AS
        DECLARE @CurrentOrder int
        DECLARE @retord int
        DECLARE @Id int
    
        SELECT @CurrentOrder = FLOOR(RAND() * (10000 - 0 + 1) + 0);
    
        UPDATE Users
        SET Users.CurrentOrder = @CurrentOrder
        WHERE Users.Username = @Username
    
            SELECT @Id=Users.Id
            FROM Users
            WHERE Users.Username = @Username;
    
        INSERT INTO Orders(Id,OrderId,DateOrdered)
        VALUES (@Id,@CurrentOrder, @DateOrdered);
    
        SELECT @retord = @CurrentOrder
    
        RETURN @retord
    

    测试结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 2018-09-29
      • 2011-06-18
      • 2019-03-05
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      相关资源
      最近更新 更多