Есть ли способ удалить старую запись, а затем вставить новую? У меня есть электронная таблица 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 |
Может кто-нибудь мне помочь? СПАСИБО
в чем была ошибка? вроде как помогает нам увидеть, что происходит ...
System.Data.SqlServerCe.SqlCeException: произошла ошибка при синтаксическом анализе запроса. [Номер строки токена = 1, смещение строки токена = 34, Ошибка токена = INSERT]
вы можете захотеть использовать транзакцию
если я использую using (SqlCeCommand inst = new SqlCeCommand ("УДАЛИТЬ ИЗ EMPLOYEELEAVEHISTORY; ВСТАВИТЬ В EMPLOYEELEAVEHISTORY (EmployeeNum, EmployeeName) VALUES (@EmployeeNum, @Employee errorName), это дает мне это имя участника);"
Мне пришла в голову идея использовать оператор if else, если запись находится в базе данных, она будет обновлять / удалять, а затем вставлять
DELETE FROM EMPLOYEELEAVEHISTORY
Вы хотите удалить строки все?
проблема, с которой я сталкиваюсь, заключается в том, что если я получаю запись из excel с помощью oledb, а затем перекидываю ее в private void saveleave, который содержит параметры и операторы sqlce. когда я пытаюсь обновить, запись не обновляется, вместо этого она снова вставляет запись. поэтому вместо 3 (трех) записей он становится 6 (шестью) записями. затем, если в моем sdf уже есть запись, и я добавляю еще одну, чтобы преуспеть с тем же Emp_num, но с другим Emp_name, она обновляет запись с тем же Emp_num.
пример. Я создал запись из 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
@mjwills да. потому что в моем Excel старая запись все еще существует, поэтому это не проблема, если я удалю все строки, она просто увеличивает первичный ключ
Я пробую другой способ выполнения инструкции обновления, но каждая запись с одинаковым 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);
}
}
}
}
Я попытался поставить точку с запятой в одном утверждении, но это дает мне ошибку