Visual Studio говорит, что я пытаюсь вставить NULL в запись "id" таблицы "Cars_details" - PullRequest
3 голосов
/ 19 мая 2019

Я пишу программу для университетского класса, и я застрял.У меня 2 таблицы, и я хочу вставить в них данные одним текстом.

Автомобили

  • id INT NOT NULL ПЕРВИЧНЫЙ КЛЮЧ, ИДЕНТИЧНОСТЬ (1,1)
  • userId INT NOT NULL ИНОСТРАННЫЙ КЛЮЧ Пользователи (id)

Car_Details

  • id INT NOT NULL ПЕРВИЧНЫЙ КЛЮЧ,ИНОСТРАННЫЙ КЛЮЧ Автомобили (id)
  • имя varchar (250) NOT NULL
  • body_type VARCHAR (250) NOT NULL,
  • fuel_type VARCHAR (250) NOT NULL,
  • motor_power VARCHAR (250) NOT NULL,
  • manufacturing_year INT NOT NULL

Я говорю, что я пытаюсь вставить значение NULL для записи id в Car_DetailsТаблица.Ниже я написал свой метод, как я пытался это сделать.

Пробовал делать это с транзакцией, но это тоже не сработало.

public int Insert(Record record)
{
        SqlCommand command = new SqlCommand();
        command.CommandType = System.Data.CommandType.Text;
        //command.CommandText = @"INSERT INTO Cars(userId)
        //                        VALUES ((SELECT id FROM Users WHERE id = Users.id));
        //                        INSERT INTO Car_Details(id, name, body_type, fuel_type, motor_power, manufacture_year)
        //                        VALUES ((SELECT TOP 1 id FROM Cars),@name, @body_type, @fuel_type, @motor_power, @manufacture_year);";

        command.CommandText = "SET XACT_ABORT ON BEGIN TRANSACTION DECLARE @CarID int 
  INSERT INTO Cars(userID) VALUES((SELECT id FROM Users WHERE id = Users.id))" +
            "SELECT @CarID = scope_identity()" +
            "INSERT INTO Car_Details VALUES(@CarID, @name, @body_type" + 
            "@fuel_type, @motor_power, @manufacture_year)" +
            "COMMIT";
                    //SqlParameter p_id = new SqlParameter();
                    //p_id.ParameterName = "@id";
                    //p_id.SqlDbType = System.Data.SqlDbType.Int;
                    //p_id.Direction = System.Data.ParameterDirection.Input;
                    //p_id.Value = (record as CarRecord).Id;
                    //command.Parameters.Add(p_id);

        SqlParameter p_name = new SqlParameter();
        p_name.ParameterName = "@name";
        p_name.SqlDbType = System.Data.SqlDbType.Char;
        p_name.Direction = System.Data.ParameterDirection.Input;
        p_name.Value = (record as CarRecord).Name;
        command.Parameters.Add(p_name);

        SqlParameter p_body_type = new SqlParameter();
        p_body_type.ParameterName = "@body_type";
        p_body_type.SqlDbType = System.Data.SqlDbType.VarChar;
        p_body_type.Direction = System.Data.ParameterDirection.Input;
        p_body_type.Value = (record as CarRecord).Body_type;
        command.Parameters.Add(p_body_type);

        SqlParameter p_fuel_type = new SqlParameter();
        p_fuel_type.ParameterName = "@fuel_type";
        p_fuel_type.SqlDbType = System.Data.SqlDbType.VarChar;
        p_fuel_type.Direction = System.Data.ParameterDirection.Input;
        p_fuel_type.Value = (record as CarRecord).Fuel_type;
        command.Parameters.Add(p_fuel_type);

        SqlParameter p_motor_power = new SqlParameter();
        p_motor_power.ParameterName = "@motor_power";
        p_motor_power.SqlDbType = System.Data.SqlDbType.Int;
        p_motor_power.Direction = System.Data.ParameterDirection.Input;
        p_motor_power.Value = (record as CarRecord).Motor_power;
        command.Parameters.Add(p_motor_power);

        SqlParameter p_manufactrue_year = new SqlParameter();
        p_manufactrue_year.ParameterName = "@manufacture_year";
        p_manufactrue_year.SqlDbType = System.Data.SqlDbType.Int;
        p_manufactrue_year.Direction = System.Data.ParameterDirection.Input;
        p_manufactrue_year.Value = (record as CarRecord).Manufacture_year;
        command.Parameters.Add(p_manufactrue_year);


        command.Connection = getConnection();

        int affectedRows = command.ExecuteNonQuery();
        command.Connection.Close();

        return affectedRows;
}

1 Ответ

1 голос
/ 19 мая 2019

Отсутствует предложение IDENTITY (1,1) для полей первичного ключа. В текущем сценарии вам нужно использовать определение IDENTITY или указать значение первичного ключа в коде, а затем передать его команде SQL.

Здесь вы можете найти больше информации: https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-2017

Существует также OUTPUT INSERTED. [Имя столбца PK]: https://www.sqlservercentral.com/articles/the-output-clause-for-insert-and-delete-statements

С предложением OUTPUT вам нужно использовать Reader, чтобы получить от него ответ.

Вероятно, вам нужно использовать этот подход, если вы работаете в незавершенной (незафиксированной) транзакции.

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