УДАЛИТЬ, а затем ВСТАВИТЬ в одном запросе?

Есть ли способ удалить старую запись, а затем вставить новую? У меня есть электронная таблица Excel, и я использую OLEDB, а затем передаю ее команде SQL Server CE для вставки в файл базы данных .sdf.

Я хочу удалить старую запись или обновить старую запись (намного лучше), а затем вставить новую.

У меня есть данные в электронной таблице EmployeeLeaveHistory, содержащие столбцы Emp_Num и Emp_Name

Emp_Num | Emp_Name |
--------+----------+
12345   | anna     |
12345   | anna     |
23451   | jonalyn  |

Используя oledb, он получит запись

        int EmployeeNum;
        string EmployeeName;
        string constr = "";
        string ext = Path.GetExtension(FileUpload1.FileName).ToLower();
        string path = Server.MapPath("~/Excel/" + FileUpload1.FileName);
        FileUpload1.SaveAs(path);

        if (ext.Trim() == ".xls")
        {
            constr = "Povider=Microsoft.Jet.OLEDB.4.0; Data Source = " + path + ";Extended Properties=\"Excel.8.0;HDR=Yes;IMEX=2\"";
        }
        else if (ext.Trim() == ".xlsx")
        {
            constr = " Provider=Microsoft.ACE.OLEDB.12.0;Data Source = " + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
        }

        string query = "SELECT * FROM [EmployeeLeaveHistory$]";

        using (OleDbConnection conn = new OleDbConnection(constr))
        {
            conn.Open();

            using (OleDbCommand cmd2 = new OleDbCommand(query, conn))
            {
                using (OleDbDataReader dr2 = cmd2.ExecuteReader())
                {
                    while (dr2.Read())
                    {
                        EmployeeNum = Convert.ToInt32(dr2["Emp_Num"]);
                        EmployeeName = Convert.ToString(dr2["Emp_Name"]);

                        SaveLeave(EmployeeNum, EmployeeName);
                    }
                }
            }
        }
    }

Затем у меня есть приватный void SaveLeave, который перехватит запись из oledb, а затем вставит ее в мой файл .sdf.

private void SaveLeave(Int32 EmployeeNum, string EmployeeName)
{
        string constring = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;
       string check = "SELECT COUNT(*) FROM EMPLOYEELEAVEHISTORY WHERE Id=@@IDENTITY";
       string update = "UPDATE EMPLOYEELEAVEHISTORY SET EmployeeName=@EmployeeName WHERE EmployeeNum=@EmployeeNum;";
       string insert = "INSERT INTO EMPLOYEELEAVEHISTORY(EmployeeNum, EmployeeName) VALUES (@EmployeeNum, @EmployeeName);";

        using (SqlCeConnection con = new SqlCeConnection(constring))
        {
            con.Open();

            using (SqlCeCommand cmd = new SqlCeCommand(check, con))
            {
                cmd.Parameters.AddWithValue("@EmployeeNum", EmployeeNum);

                using (SqlCeDataReader read = cmd.ExecuteReader())
                {
                    read.Read();

                    int count = read.GetInt32(0);

                    if (count > 0)
                    {

                        using (SqlCeCommand upt = new SqlCeCommand(update))
                        {
                            upt.Parameters.AddWithValue("@EmployeeNum", EmployeeNum);
                            upt.Parameters.AddWithValue("@NoOfDays", NoOfDays);
                            upt.Connection = con;
                            upt.ExecuteNonQuery();
                        }
                    }
                    else
                    {                            using (SqlCeCommand inst = new SqlCeCommand(insert))
                        {
                            inst.Parameters.AddWithValue("@EmployeeNum", EmployeeNum);
                            inst.Parameters.AddWithValue("@EmployeeName", EmployeeName);
                            inst.Connection = con;
                            inst.ExecuteNonQuery();
                        }
                    }
                }                
            }          
        }
    }

Если я использую оператор Delete, последняя строка записи Excel, которая является 23451|jonalyn|, является единственной, которая вставляется в sdf. Прямо сейчас я использую оператор обновления, но проблема в том, что когда я использую оператор обновления, запись не обновляется, но дублирует запись, а также если я добавлю еще одну запись в свой Excel следующим образом:

Emp_Num | Emp_Name |
--------+----------+
12345   | anna     |
12345   | anna     |
23451   | jonalyn  |
12      | jade     |

И используйте запрос на вставку в мой .sdf, запись в моем .sdf станет такой:

EmployeeNum | EmployeeName |
------------+--------------+
12345       | anna         |
12345       | anna         |
23451       | jonalyn      |
12345       | anna         |
12345       | anna         |
23451       | jonalyn      |
12          | jade         |

Может кто-нибудь мне помочь? СПАСИБО

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

beginneratstart 02.11.2018 04:14

в чем была ошибка? вроде как помогает нам увидеть, что происходит ...

Jazb 02.11.2018 04:24

System.Data.SqlServerCe.SqlCeException: произошла ошибка при синтаксическом анализе запроса. [Номер строки токена = 1, смещение строки токена = 34, Ошибка токена = INSERT]

beginneratstart 02.11.2018 04:27

вы можете захотеть использовать транзакцию

Jazb 02.11.2018 04:28

если я использую using (SqlCeCommand inst = new SqlCeCommand ("УДАЛИТЬ ИЗ EMPLOYEELEAVEHISTORY; ВСТАВИТЬ В EMPLOYEELEAVEHISTORY (EmployeeNum, EmployeeName) VALUES (@EmployeeNum, @Employee errorName), это дает мне это имя участника);"

beginneratstart 02.11.2018 04:28

Мне пришла в голову идея использовать оператор if else, если запись находится в базе данных, она будет обновлять / удалять, а затем вставлять

beginneratstart 02.11.2018 04:30
DELETE FROM EMPLOYEELEAVEHISTORY Вы хотите удалить строки все?
mjwills 02.11.2018 04:36

проблема, с которой я сталкиваюсь, заключается в том, что если я получаю запись из excel с помощью oledb, а затем перекидываю ее в private void saveleave, который содержит параметры и операторы sqlce. когда я пытаюсь обновить, запись не обновляется, вместо этого она снова вставляет запись. поэтому вместо 3 (трех) записей он становится 6 (шестью) записями. затем, если в моем sdf уже есть запись, и я добавляю еще одну, чтобы преуспеть с тем же Emp_num, но с другим Emp_name, она обновляет запись с тем же Emp_num.

beginneratstart 02.11.2018 04:41

пример. Я создал запись из excel, у которой есть Emp_num / Emp_name 1 / jay 2 / june 1 / jay, затем бросьте ее в saveleave, она вставляет первые три записи, но когда я добавляю еще одну в электронную таблицу Excel, запись в sdf становится такой Emp_Num / Emp_Name 1 / jay 2/1 июня / jay 1 / jay 2/1 июня / jay 5 / mark

beginneratstart 02.11.2018 04:42

@mjwills да. потому что в моем Excel старая запись все еще существует, поэтому это не проблема, если я удалю все строки, она просто увеличивает первичный ключ

beginneratstart 02.11.2018 04:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
132
1

Ответы 1

Я пробую другой способ выполнения инструкции обновления, но каждая запись с одинаковым EmployeeNum обновляется последней записью, полученной командой OLEDB. лучший способ для меня - удалить запись и вставить новую (обратите внимание, что единственная проблема здесь в том, что если вы удалите старую запись в файле Excel, ее нельзя будет получить, если вы не сохраните старую запись в другом файле Excel).

вот код для оператора DELETE, затем INSERT.

            string query2 = "SELECT * FROM [EmployeeLeaveHistory$]";
            using (OleDbCommand cmd2 = new OleDbCommand(query2, conn))
            {
              using (OleDbDataReader dr2 = cmd2.ExecuteReader())
                {

                    string constring = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;
                    using (SqlCeConnection con = new SqlCeConnection(constring))
                    {
                        con.Open();
                        string del = "DELETE FROM EMPLOYEELEAVEHISTORY";
                        using (SqlCeCommand delete = new SqlCeCommand(del))
                        {
                            delete.Connection = con;
                            delete.ExecuteNonQuery();
                        }


                        using (SqlCeBulkCopy copy = new SqlCeBulkCopy(con))
                        {
                            copy.DestinationTableName = "EMPLOYEELEAVEHISTORY";

                            copy.ColumnMappings.Add("Emp_Num", "EmployeeNum");
                            copy.ColumnMappings.Add("Emp_Name", "EmployeeName");


                            copy.WriteToServer(dr2);


                        }
                    }
                }
            }

Другие вопросы по теме