УДАЛИТЬ, а затем вставить в один запрос? - PullRequest
0 голосов
/ 02 ноября 2018

Есть ли способ удалить старую запись, а затем вставить новую? У меня есть таблица 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);
                    }
                }
            }
        }
    }

Затем у меня есть личная пустая папка 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         |

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

1 Ответ

0 голосов
/ 04 ноября 2018

Я пытаюсь использовать другой способ выполнения оператора update, но каждая запись с одинаковым 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);


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