Почему моя хранимая процедура не имеет доступа к нескольким таблицам? - PullRequest
0 голосов
/ 27 марта 2020

Я работаю с ASP. NET и SQL Сервером и собираю весь проект в Visual Studio. Если неясно, я пытаюсь обновить таблицу пользователей случайно сгенерированным числом, в котором присутствует имя пользователя user, затем вставить дату, usersid и orderid и userid в таблицу Orders.

Я не вижу в этом сразу ничего плохого. Я получаю сообщение об ошибке, что значения NULL не могут быть помещены в ненулевой столбец (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 Хранимая процедура на сервере:

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

EDIT

После обратной связи я проверил, передается ли имя пользователя между страницами и передается ли оно как 2? что я тут делаю не так

Передача имени пользователя

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

Получение имени пользователя

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

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

На основании моего теста я нахожу решение. Нам нужно использовать оператор вставки в полных параметрах.

Вы можете обратиться к правильной хранимой процедуре.

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

Протестированный результат:

enter image description here

0 голосов
/ 27 марта 2020
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...