C # Вставка значения внешнего ключа - PullRequest
0 голосов
/ 24 октября 2018

У меня есть 2 таблицы: tableCustomerLogin и tableCustomerRegister.Существует внешний ключ для таблицы CustomerLogin, т. Е. cust_id .

. В таблице CustomerLogin у меня есть таблицаCustomerLogin

    cust_login_id
    cust_id
    cust_email
    cust_username
    cust_password

и для таблицы CustomerRegister,

    tableCustomerRegister
    cust_id
    cust_fullname
    cust_username
    cust_email
    cust_password
    cust_mobile_number
    cust_image
    cust_address1
    cust_address2
    cust_city
    cust_postcode
    cust_create_acc_time

При регистрации клиента данные будут храниться в таблице CustomerRegister.Как заставить его зарегистрироваться в таблице CustomerLogin?

string sql = @"INSERT INTO tableCustomerRegister VALUES (@cust_fullname, @cust_username, @cust_email, @password, @cust_mobile_phone, @cust_address1, @cust_address2, @cust_image, @cust_city, @cust_state, @cust_postcode, @cust_create_acc_time, @role, @enabled)";

            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Parameters.AddWithValue("@cust_fullname", txtFirstName.Text + " " + txtLastName.Text);
            cmd.Parameters.AddWithValue("@cust_username", txtUsername.Text);
            cmd.Parameters.AddWithValue("@cust_email", txtEmail.Text);
            cmd.Parameters.AddWithValue("@password", passwordhash);
            cmd.Parameters.AddWithValue("@cust_mobile_phone", txtMobilePhone.Text);
            cmd.Parameters.AddWithValue("@cust_address1", txtAddress1.Text);
            cmd.Parameters.AddWithValue("@cust_address2", txtAddress2.Text);
            cmd.Parameters.AddWithValue("@cust_image", txtProfilePicture.Text);
            cmd.Parameters.AddWithValue("@cust_city", ICityString());
            cmd.Parameters.AddWithValue("@cust_state", ddState.SelectedValue.ToString());
            cmd.Parameters.AddWithValue("@cust_postcode", txtPostcode.Text);
            cmd.Parameters.AddWithValue("@cust_create_acc_time", DateTime.Now);
            cmd.Parameters.AddWithValue("@role", "user");
            cmd.Parameters.AddWithValue("@enabled", enabled);
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
                lblStatus.Text = "Status: Data successfully saved.";
            }

Ответы [ 5 ]

0 голосов
/ 24 октября 2018

Вы можете сначала insert a tableCustomerRegister запись, а затем insert другие данные в таблице tableCustomerLogin.Лучше сделать это в блоке транзакция .

Другой способ: вы можете добавить trigger в таблицу tableCustomerLogin.

CREATE TRIGGER trg_tableCustReg ON tableCustomerRegister
FOR INSERT
AS   
  /*
   *  if CustLoginID is a identity , no dont need to add  
   */ 
    INSERT INTO tableCustomerLogin 
            (cust_login_id, cust_id, cust_email, cust_username, cust_password)
        Select
            'CustLoginID', 
            cust_id , 
            cust_email, 
            cust_username, 
            user_password
            FROM inserted

go
0 голосов
/ 24 октября 2018

ну, прежде всего вам нужно изменить ваш запрос

string sql = @"INSERT INTO tableCustomerRegister  OUTPUT INSERTED.cust_id VALUES (@cust_fullname, @cust_username, @cust_email, @password, @cust_mobile_phone, @cust_address1, @cust_address2, @cust_image, @cust_city, @cust_state, @cust_postcode, @cust_create_acc_time, @role, @enabled)";
 SqlCommand cmd = new SqlCommand(sql, conn);
        cmd.Parameters.AddWithValue("@cust_fullname", txtFirstName.Text + " " + txtLastName.Text);
        cmd.Parameters.AddWithValue("@cust_username", txtUsername.Text);
//so on (all your parameters)
var custid  = (int)cmd.ExecuteScalar()

ExecuteScalar вернуть int, в этом случае он вернет cust_id, так как ваш запрос имеет OUTPUT INSERTED.cust_id.Теперь Вы вставили cust_id в tableCustomerRegister .Теперь все, что вам нужно сделать, это просто написать еще один запрос для сохранения данных в tableCustomerLogin с внешним ключом cust_id.как это,

string Sql2 = "INSERT INTO tableCustomerLogin (column_names) VALUES (parameters values)";
SqlCommand cmd = new SqlCommand(sq2, conn);
cmd.Parameters.AddWithValue("@cust_id",custid);  //as foreign key
//all other Parameters
0 голосов
/ 24 октября 2018

есть два разных способа.Вы должны использовать SCOPE_IDENTITY

string sql = @"INSERT INTO tableCustomerRegister VALUES (@cust_fullname, @cust_username, @cust_email, @password, @cust_mobile_phone, @cust_address1, @cust_address2, @cust_image, @cust_city, @cust_state, @cust_postcode, @cust_create_acc_time, @role, @enabled) SELECT SCOPE_IDENTITY()";

SCOPE_IDENTITY Возвращает последнее значение идентификатора, вставленное в столбец идентификаторов в той же области действия

var newId= cmd.ExecuteScaler();

newId создал новый идентификатор первичного ключа для вас cust_id

у вас есть ID (cust_id) и вы можете зарегистрироваться вТаблица входа в систему.

INSERT INTO  tableCustomerLogin (cust_login_id,**cust_id**,cust_email,cust_username,cust_password)


cust_id = newId 
0 голосов
/ 24 октября 2018

Если Cust_id автоматически создается в таблице tableCustomerRegister, то вы можете сохранить тот же идентификатор в таблице tableCustomerLogin (cust_id).тогда работает только ваш внешний ключ.

     try
                    {
                        conn.Open();
                        cmd.ExecuteNonQuery();
                        SqlCommand get_custid_cmd = new SqlCommand("select @@identity", conn);
                        int cust_id = Convert.ToInt32(get_custid_cmd.ExecuteScalar());
                        string sql_insert = @"INSERT INTO tableCustomerLogin VALUES (@cust_id, @cust_username, @cust_email, @password)";

                SqlCommand cmd_insert = new SqlCommand(sql_insert, conn);
                cmd_insert.Parameters.AddWithValue("@cust_id",cust_id);
                cmd_insert.Parameters.AddWithValue("@cust_username", txtUsername.Text);
                cmd_insert.Parameters.AddWithValue("@cust_email", txtEmail.Text);
                cmd_insert.Parameters.AddWithValue("@password", passwordhash);
                cmd_insert.ExecuteNonQuery();
                            lblStatus.Text = "Status: Data successfully saved.";

                    }
0 голосов
/ 24 октября 2018

Вероятно, лучшим решением будет следовать принципу СУХОЙ, не повторяйте себя.

Я думаю, что вы можете, например, сохранить всю информацию в одной таблице customer_table, а затем извлечь необходимые данные с помощью более простой логики.только из этой таблицы.

Вместо этого, если вы хотите остаться в своей фактической структуре данных, просто добавьте новый оператор вставки после первого разделения через точку с запятой

как вставить данные в несколько таблиц водин раз

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