Member 11239384 Ответов: 1

Как вставить в таблицу внешний ключ ? как он будет выбирать значения внешнего ключа из родительской таблицы?


USE [Apartmentmanagementsystem]
GO
/****** Object: StoredProcedure [dbo].[Rento] Script Date: 6/16/2018 10:43:15 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[Rento]
@rent_id int,
@rent_fee varchar (255),
@late_fee varchar (255),
@due_date varchar (255),
@service_charge varchar (255),
@lease_id int,
@pay_id int,
@pay_date varchar (255),
@pay_amount varchar (255),
@receipt_no varchar (255)

as
if @rent_id=0
begin

insert into Rent ( rent_fee,late_fee,due_date,service_charge,lease_id) values (@rent_fee,@late_fee,@due_date,@service_charge,@lease_id)
select @rent_id=SCOPE_IDENTITY()
insert into Payment (pay_date,pay_amount,receipt_no,rent_id) values(@pay_date,@pay_amount,@receipt_no,@rent_id)
end

C# code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace ApartmentManagement
{
public partial class Rent : System.Web.UI.Page
{
String CS = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{



if (!String.IsNullOrEmpty(Request.QueryString["id"]))
{

int rent_id = Convert.ToInt32(Request.QueryString["id"]);
using (SqlConnection constring = new SqlConnection(CS))
{
constring.Open();
SqlDataAdapter sqda = new SqlDataAdapter("userview2", constring);
sqda.SelectCommand.CommandType = CommandType.StoredProcedure;
sqda.SelectCommand.Parameters.AddWithValue("@rent_id", rent_id);
DataTable dtbl = new DataTable();
sqda.Fill(dtbl);
hfrent_id.Value = rent_id.ToString();
if (dtbl.Rows.Count > 0)
{
txtRentfee.Text = dtbl.Rows[0][1].ToString();
txtLfee.Text = dtbl.Rows[0][2].ToString();
txtDdate.Text = dtbl.Rows[0][3].ToString();
txtScharge.Text = dtbl.Rows[0][4].ToString();
txtPdate.Text = dtbl.Rows[0][8].ToString();
txtPamount.Text = dtbl.Rows[0][9].ToString();
txtReceipt.Text = dtbl.Rows[0][10].ToString();

}

}
}
}

}

protected void btnSave4_Click(object sender, EventArgs e)
{
try
{
using (SqlConnection constring = new SqlConnection(CS))
{
constring.Open();
SqlCommand sqlcmd = new SqlCommand("Rento", constring);
sqlcmd.CommandType = CommandType.StoredProcedure;
sqlcmd.Parameters.AddWithValue("@rent_id", Convert.ToInt32(hfrent_id.Value == "" ? "0" : hfrent_id.Value));
sqlcmd.Parameters.AddWithValue("@rent_fee", txtRentfee.Text.Trim());
sqlcmd.Parameters.AddWithValue("@late_fee", txtLfee.Text.Trim());
sqlcmd.Parameters.AddWithValue("@due_date", txtDdate.Text.Trim());
sqlcmd.Parameters.AddWithValue("@service_charge", txtScharge.Text.Trim());
sqlcmd.Parameters.AddWithValue("@lease_id", 0);
sqlcmd.Parameters.AddWithValue("@pay_id", 0);
sqlcmd.Parameters.AddWithValue("@pay_date", txtPdate.Text.Trim());
sqlcmd.Parameters.AddWithValue("@pay_amount", txtPamount.Text.Trim());
sqlcmd.Parameters.AddWithValue("@receipt_No", txtReceipt.Text.Trim());

sqlcmd.ExecuteNonQuery();

Response.Write("window.alert('not saved');");


}
}

catch (Exception ex)
{
Response.Write("window.alert('not saved');");
}

}

protected void btnUpdate4_Click(object sender, EventArgs e)
{
try
{
using (SqlConnection constring = new SqlConnection(CS))
{
constring.Open();
SqlCommand sqlcmd = new SqlCommand("Rento1", constring);
sqlcmd.CommandType = CommandType.StoredProcedure;
sqlcmd.Parameters.AddWithValue("@rent_id", Convert.ToInt32(hfrent_id.Value == "" ? "0" : hfrent_id.Value));
sqlcmd.Parameters.AddWithValue("@rent_fee", txtRentfee.Text.Trim());
sqlcmd.Parameters.AddWithValue("@late_fee", txtLfee.Text.Trim());
sqlcmd.Parameters.AddWithValue("@due_date", txtDdate.Text.Trim());
sqlcmd.Parameters.AddWithValue("@service_charge", txtScharge.Text.Trim());
sqlcmd.Parameters.AddWithValue("@lease_id", 0);
sqlcmd.Parameters.AddWithValue("@pay_id", 0);
sqlcmd.Parameters.AddWithValue("@pay_date", txtPdate.Text.Trim());
sqlcmd.Parameters.AddWithValue("@pay_amount", txtPamount.Text.Trim());
sqlcmd.Parameters.AddWithValue("@receipt_No", txtReceipt.Text.Trim());

sqlcmd.ExecuteNonQuery();

Response.Write("window.alert('saved');");
}
}

catch (Exception ex)
{
Response.Write("window.alert('not saved');");
}

}
}
}


problem is that it is not inserting.why?
how do i make it such that lase_id in first row of Lease table will be lease id in first row of Rent table.
and Payment table is not picking rent_id either





here are tables 

CREATE TABLE Lease
(

lease_id int IDENTITY(1,1) NOT NULL PRIMARY KEY ,
initial_date varchar(255),
end_date varchar(255),
deposit varchar(255),
tenant_id int FOREIGN KEY REFERENCES Tenant(tenant_id),
Created datetime2(3) NOT NULL constraint DF_Lease_Created default (Sysdatetime()),
)
CREATE TABLE Rent
(

rent_id int IDENTITY(1,1) NOT NULL PRIMARY KEY ,
rent_fee varchar(255) ,
late_fee varchar(255),
due_date varchar(255),
service_charge varchar(255),
lease_id int FOREIGN KEY REFERENCES Lease(lease_id),
Created datetime2(3) NOT NULL constraint DF_Rent_Created default (Sysdatetime()),
)

CREATE TABLE Payment
(

pay_id int IDENTITY(1,1) NOT NULL PRIMARY KEY ,
pay_date varchar(255),
pay_amount varchar(255),
receipt_no varchar(255),
rent_id int FOREIGN KEY REFERENCES Rent(rent_id),
Created datetime2(3) NOT NULL constraint DF_Payment_Created default (Sysdatetime()),
)`enter code here`

What I have tried:

i have tried playing around with procedure Rento to no avail


Что я уже пробовал:

я попытался удалить lease_id и посмотреть, будет ли он вставлен, но пока нет

Mike V Baker

Ваша таблица аренды имеет внешний ключ lease_id, который ссылается на таблицу аренды. Я вижу, что вы получаете rent_id от SCOPE_INDENTITY(). Это не работает, потому что вы передаете 0 для lease_id, поэтому ссылка не работает и не вставляет запись аренды. Вот почему он не может выбрать SCOPE_IDENTITY() (или @@IDENTITY).
BTW - может интерактивно тестировать хранимую процедуру в среде MS Sql Server Management Studio. Щелкните правой кнопкой мыши на SP и выберите Выполнить. Введите значения, которые вы передаете из программы, и запустите ее. Вы увидите сообщения об ошибках в окне сообщения.

1 Ответов

Рейтинг:
1

OriginalGriff

Видеть здесь: @@IDENTITY (Transact-SQL) | Microsoft Docs[^]


Member 11239384

хорошо, так как же мне реализовать это в текущем контексте, пожалуйста, дайте мне пример хранимой процедуры выше, сделанной правильно.Я застрял.

OriginalGriff

Прочтите ссылку, и это довольно очевидно. Он даже включает в себя пример!

Member 11239384

Изменить процедуру [dbo].[Ренто]
@rent_id инт,
@rent_fee varchar (255),
@late_fee varchar (255),
@due_date varchar (255),
@service_charge varchar (255),
@lease_id инт,
@pay_id инт,
@pay_date varchar (255),
@pay_amount varchar (255),
@receipt_no varchar (255)

как
выберите lease_id из списка Lease, где lease_id=@@identity
если @rent_id=0
начать

вставить в Rent ( rent_fee,late_fee,due_date,service_charge,lease_id) значения (@rent_fee,@late_fee,@due_date,@service_charge,@lease_id)
выберите @rent_id=SCOPE_IDENTITY()
вставить в платеж (pay_date,pay_amount,receipt_no,rent_id) значения(@pay_date,@pay_amount,@receipt_no,@rent_id)
конец

это не работает

OriginalGriff

Хватит гадать. Начинать думать.
Это даже-похоже - на допустимый синтаксис вставки SQL?

Member 11239384

помощь

OriginalGriff

Перестаньте ожидать, что люди сделают это за вас - это не сложно. Немного поразмыслив, вы бы получили это еще час назад.

INSERT INTO MyTable (MyColumn) VALUES (MyValue)

А теперь, как ты думаешь, куда он должен пойти?

Member 11239384

спасибо сработало

OriginalGriff

Превосходно! :большой палец вверх:
Видите, как это просто?

Member 11239384

да но в дальнейшем он вставил null в столбец lease_id

должен ли я был сделать что-то еще с родительской стороны?

OriginalGriff

Ну...это ваш код - вы передаете его как один из параметров...или, скорее, вы этого не делаете...

Member 11239384

Используйте [Apartmentmanagementsystem]
ГО
/****** Объект: StoredProcedure [dbo].[Ренто] Дата написания сценария: 16.06.2018 5:25:03 PM ******/
УСТАНОВИТЕ ANSI_NULLS НА
ГО
УСТАНОВИТЕ QUOTED_IDENTIFIER НА
ГО
Изменить процедуру [dbo].[Ренто]
@rent_id инт,
@rent_fee varchar (255),
@late_fee varchar (255),
@due_date varchar (255),
@service_charge varchar (255),
@lease_id инт,
@pay_id инт,
@pay_date varchar (255),
@pay_amount varchar (255),
@receipt_no varchar (255)

как

начать

вставить в Rent ( rent_fee,late_fee,due_date,service_charge,lease_id) значения (@rent_fee,@late_fee,@due_date,@service_charge,@@IDENTITY)
выберите @rent_id=SCOPE_IDENTITY()
вставить в платеж (pay_date,pay_amount,receipt_no,rent_id) значения(@pay_date,@pay_amount,@receipt_no,@rent_id)
конец

пожалуйста, покажите мне, как это сделать правильно.

OriginalGriff

Какого черта ты об этом не думаешь? Ты не тупица, ты просто настаиваешь на догадках и надежде вместо того, чтобы реально думать...и не ной - это может подействовать на твою мать, но на остальной мир это произведет меньшее впечатление...

INSERT INTO MasterTable (MyColumn) VALUES ("Hello");
INSERT INTO ForeignKeyTable (FKID, Desc) VALUES(@@IDENTITY, "A widget");


Насколько это было трудно?