Давайте начнем с того, что сделаем код более читабельным. Вот результат:
SqlCeCommand getAllBills = new SqlCeCommand("select * from bill_discount", primaryConnection);
SqlCeDataReader allBillsReader = getAllBills.ExecuteReader();
while (allBillsReader.Read())
{
SqlCeCommand getBill = new SqlCeCommand("select * from bill_discount where bill_no = '" + allBillsReader.GetInt32(0) + "' and bill_shopdc = '" + allBillsReader.GetString(2) + "' ", secondaryConnection);
SqlCeDataReader billReader = getBill.ExecuteReader();
if (!billReader.Read())
{
SqlCeCommand addMissingBill = new SqlCeCommand("insert into bill_discount (bill_no, bill_value, bill_shopdc) values ('" + allBillsReader.GetInt32(0) + "', '" + allBillsReader.GetDouble(1) + "', '" + allBillsReader.GetString(2) + "')", secondaryConnection);
addMissingBill.ExecuteNonQuery();
}
}
Одноразовые предметы должны быть утилизированы. Давай сделаем это.
Давайте также удалим SQL-инъекции.
Наконец, давайте оптимизируем второй запрос: вам не нужно выбирать что-то и выполнять программу чтения, если вы просто хотите проверить, существует ли значение в базе данных.
using (SqlCeCommand getAllBills = new SqlCeCommand("select bill_no, bill_value, bill_shopdc from [bill_discount]", primaryConnection))
{
using (SqlCeDataReader allBillsReader = getAllBills.ExecuteReader())
{
while (allBillsReader.Read())
{
using (SqlCeCommand getBill = new SqlCeCommand("if exists(select * from [bill_discount] where [bill_no] = @billNumber and bill_shopdc = @billShop) select 1 else select 0", secondaryConnection))
{
getBill.Parameters.AddWithValue("@billNumber", allBillsReader["bill_no"]);
getBill.Parameters.AddWithValue("@billShop", allBillsReader["bill_shopdc"]);
bool billExists = Convert.ToBoolean(getBill.ExecuteScalar());
if (!billExists)
{
using (SqlCeCommand addMissingBill = new SqlCeCommand("insert into [bill_discount] ([bill_no], [bill_value], [bill_shopdc]) values (@billNumber, @billValue, @billShop)", secondaryConnection))
{
addMissingBill.Parameters.AddWithValue("@billNumber", allBillsReader["bill_no"]);
addMissingBill.Parameters.AddWithValue("@billValue", allBillsReader["bill_value"]);
addMissingBill.Parameters.AddWithValue("@billShop", allBillsReader["bill_shopdc"]);
int countAffectedRows = addMissingBill.ExecuteNonQuery();
Debug.Assert(countAffectedRows == 1, "The data was not inserted.");
}
}
}
}
}
}
Итак, мы здесь.
Теперь это решение с низкой производительностью. Чтобы быть более эффективным, вы можете сделать то же самое в отдельном запросе SQL с объединениями . Поскольку две таблицы, вероятно, расположены на разных серверах, вы можете посмотреть на связанных серверов : возможность, позволяющая выполнить один запрос для нескольких таблиц с нескольких серверов.