Как обновить 2 таблицы sqlserver, используя 2 запроса с наличием столбца идентичности в C #? - PullRequest
0 голосов
/ 31 мая 2018

Используя эти два запроса отдельно для таблиц обновления, я мог обновить только таблицу PO. Когда я пытаюсь обновить таблицу PO_Cart (которая относится к datagridview), он сказал, что не может обновить столбец идентификаторов. Что я могу сделать сейчас, чтобы решить эту проблему

public void UpdatePurchseOrderTable(int PO_No,int Supplier_ID, string Date, string RequiredDate, decimal GrandTotal)
    {
        DynamicConnection con = new DynamicConnection();
        con.mysqlconnection();
        string query = "UPDATE TBL_PO "
            + " SET Supplier_ID = @Supplier_ID,Date = @Date,"
            + "RequiredDate = @RequiredDate,GrandTotal=@GrandTotal"
             + " WHERE PO_No = @PO_No";
        con.sqlquery(query);
        con.cmd.Parameters.Add(new SqlParameter("@PO_No", SqlDbType.Int));
        con.cmd.Parameters["@PO_No"].Value = PO_No;
        con.cmd.Parameters.Add(new SqlParameter("@Supplier_ID", SqlDbType.Int));
        con.cmd.Parameters["@Supplier_ID"].Value = Supplier_ID;
        con.cmd.Parameters.Add(new SqlParameter("@Date", SqlDbType.Date));
        con.cmd.Parameters["@Date"].Value = Date;
        con.cmd.Parameters.Add(new SqlParameter("@RequiredDate", SqlDbType.Date));
        con.cmd.Parameters["@RequiredDate"].Value = RequiredDate;
        con.cmd.Parameters.Add(new SqlParameter("@GrandTotal", SqlDbType.Money));
        con.cmd.Parameters["@GrandTotal"].Value = GrandTotal;
        con.nonquery();
    }

public void UpdatePOCartTable(int PO_No,string ISBN_No, decimal UnitPrice, int OrderQuantity, decimal Total)
    {
        DynamicConnection con = new DynamicConnection();
        con.mysqlconnection();
        string query = "UPDATE TBL_PO_Cart"
            + " SET ISBN_No=@ISBN_No,UnitPrice=@UnitPrice,"
            + "OrderQuantity=@OrderQuantity,Total=@Total"
            + "WHERE PO_No = @PO_No";
        con.sqlquery(query);
        con.cmd.Parameters.Add(new SqlParameter("@PO_No", SqlDbType.Int));
        con.cmd.Parameters["@PO_No"].Value = PO_No;
        con.cmd.Parameters.Add(new SqlParameter("@ISBN_No", SqlDbType.NVarChar));
        con.cmd.Parameters["@ISBN_No"].Value = ISBN_No;
        con.cmd.Parameters.Add(new SqlParameter("@UnitPrice", SqlDbType.Date));
        con.cmd.Parameters["@UnitPrice"].Value = UnitPrice;
        con.cmd.Parameters.Add(new SqlParameter("@OrderQuantity", SqlDbType.NVarChar));
        con.cmd.Parameters["@OrderQuantity"].Value = OrderQuantity;
        con.cmd.Parameters.Add(new SqlParameter("@Total", SqlDbType.Money));
        con.cmd.Parameters["@Total"].Value = Total;
        con.nonquery();
    }

1 Ответ

0 голосов
/ 31 мая 2018

Ваш синтаксис обновления из Join похож на MySQL.Однако в SQL Server все по-другому

UPDATE TBL_PO
SET TBL_PO.PO_No=@PO_No,TBL_PO.Supplier_ID = @Supplier_ID,TBL_PO.Date = @Date,
TBL_PO.RequiredDate = @RequiredDate,TBL_PO.GrandTotal=@GrandTotal,
FROM TBL_PO 
INNER JOIN TBL_PO_Cart ON TBL_PO_Cart.PO_No = TBL_PO.PO_No
WHERE TBL_PO.PO_No = @PO_No

UPDATE TBL_PO_Cart
SET TBL_PO_Cart.ISBN_No=@ISBN_No,TBL_PO_Cart.UnitPrice=@UnitPrice
,TBL_PO_Cart.OrderQuantity=@OrderQuantity,TBL_PO_Cart.Total=@Total
FROM TBL_PO 
INNER JOIN TBL_PO_Cart ON TBL_PO_Cart.PO_No = TBL_PO.PO_No
WHERE TBL_PO.PO_No = @PO_No

И если вы просите обновить 2 таблицы с одним оператором, это невозможно.Никакая СУБД не позволит этого.Вместо этого у вас может быть Одиночная транзакция, которая имеет 2 оператора обновления, так что вы можете зафиксировать / откатить.

Редактировать согласно измененному Вопросу:

Как описано выше, выне может обновить столбец, навязанный свойством Identity .Мы не должны касаться столбца идентификаторов в целом.

И для заполнения пробелов нам предоставляется временная настройка

Identity_Insert

Нокак объяснено в ответе ниже, вы можете удалить запись и заново установить ее с включенной выше настройкой.Вы можете попробовать это в вашем случае.

Как обновить столбец идентификации в SQL Server

...