Mina tables ser ut såhär just nu:
ParkingSpace
[ParkingSpaceID] INT IDENTITY (1, 1) NOT NULL,
[PSpaceNumber] INT NOT NULL,
[PSpaceSize] INT NOT NULL,
[PSpacesRemaining] INT NOT NULL,
PRIMARY KEY CLUSTERED ([ParkingSpaceID] ASC)
Vehicles
[VehicleID] INT IDENTITY (1, 1) NOT NULL,
[VehicleType] NVARCHAR (10) NOT NULL,
[VehicleRegNumber] NVARCHAR (10) NOT NULL,
[VehicleArrivalTime] DATETIME NOT NULL,
[ParkingSpaceID] INT NOT NULL,
PRIMARY KEY CLUSTERED ([VehicleID] ASC),
CONSTRAINT [FK_ParkingSpaceID] FOREIGN KEY ([ParkingSpaceID]) REFERENCES [dbo].[ParkingSpace] ([ParkingSpaceID])
Min stored procedure ser ut såhär:
CREATE PROCEDURE spAddVehicle
@VehicleType NVARCHAR(10),
@VehicleRegNumber NVARCHAR(10),
@VehicleArrivalTime DATE,
@PSpaceSize INT,
@PSpacesRemaining INT
AS
BEGIN
INSERT INTO Vehicles(VehicleType , VehicleRegNumber, VehicleArrivalTime) VALUES (@VehicleType, @VehicleRegNumber, GETDATE())
BEGIN
DECLARE @PSpaceNumber INT
SET @PSpaceNumber = (SELECT COUNT(*) FROM ParkingSpace) + 1
BEGIN
INSERT INTO ParkingSpace(PSpaceNumber, PSpaceSize, PSpacesRemaining) VALUES (@PSpaceNumber, @PSpaceSize, @PSpacesRemaining)
RETURN @PSpaceNumber
END
END
END
Angående mina inserts så har jag ändrat fram och tillbaka och testat massa olika varianter, bör parkingspaceID ligga inne i parameterna?
Och min C# kod för att kalla på dessa:
using(SqlConnection dbConn = new SqlConnection(connString))
{
SqlCommand cmd = new SqlCommand(sp, dbConn);
cmd.CommandType = CommandType.StoredProcedure;
addVehicle.VehicleType = UserInputHandler.GetVehicleType();
if (addVehicle.VehicleType == "Car")
{
addVehicle.VehicleRegNumber = UserInputHandler.GetVehicleRegNumberHandler();
addVehicle.VehicleRegNumber = addVehicle.VehicleRegNumber.ToUpper();
cmd.Parameters.AddWithValue("@VehicleType", addVehicle.VehicleType);
cmd.Parameters.AddWithValue("@VehicleRegNumber", addVehicle.VehicleRegNumber);
cmd.Parameters.AddWithValue("@VehicleArrivalTime", DateTime.Now);
//SqlParameter vehicleID = new SqlParameter("@VehicleID", SqlDbType.Int);
//vehicleID.Direction = ParameterDirection.Output;
//cmd.Parameters.Add(vehicleID);
//SqlParameter parkingSpaceID = new SqlParameter("@ParkingSpaceID", SqlDbType.Int);
//parkingSpaceID.Direction = ParameterDirection.Output;
//cmd.Parameters.Add(parkingSpaceID);
SqlParameter pspacenumber = cmd.Parameters.Add("@PSpaceNumber", SqlDbType.Int);
pspacenumber.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.AddWithValue("@PSpaceSize", 2);
cmd.Parameters.AddWithValue("@PSpacesRemaining", 0);
try
{
dbConn.Open();
cmd.ExecuteNonQuery();
TextToUser.PrintVehicleAdded();
}
catch (Exception msg)
{
TextToUser.PrintExceptionMessage(msg);
}
finally
{
dbConn.Close();
}
}
Kommenterade bort några rader för att testa lite olika varianter bara
Hej!
Jag tycker att det saknas lite information om hur du tänker dig att det ska fungera med motorcyklar.
Om du har ett tomt garage och sätter in en motorcykel, så kommer den ju att hamna på plats 1. Kommer det alltid att finnas plats för två (och endast två) motorcyklar eller ska det finnas flera varianter? Jag tänker att detta är det som är din PSpaceSize?
Just nu finns den inte definierad någonstans?
Oavsett varianter så behöver du ju ha en IF-sats som tar hänsyn till detta:
Hitta nästa parkeringsplats i garaget där det finns plats för en till motorcykel.
För bilar så är ju frågan redan löst, men nu behöver du justera den att fungera för motorcyklar.