Изменение содержимого таблиц с помощью объектов команд
Изменение содержимого таблиц с помощью объектов команд
Вы только что убедились, что метод ExecuteReader() извлекает объект чтения данных, позволяющий проверить результаты выполнения SQL-оператора Select в однонаправленном и доступном только для чтения потоке. Но если вы хотите применить SQL-команду, в результате которой должна произойти модификация таблицы, вы должны вызвать метод ExecuteNonQuery() соответствующего объекта команды. Этот метод выполняет вставки, обновления и. удаления в соответствии с форматом соответствующей команды.
Чтобы проиллюстрировать возможность модификации существующей базы данных с помощью вызова ExecuteNonQuery(), мы с вами построим новое консольное приложение (CarsInventoryUpdater), предоставляющее пользователю возможность изменения данных таблицы Inventory базы данных Cars. Как и в других примерах, метод Main() здесь отвечает за получение от пользователя инструкций по поводу выполнения конкретных действий, что программно реализуется с помощью оператора switch. Программа разрешает пользователю ввести следующие команды:
• I - вставить новую запись в таблицу Inventory;
• U - обновить существующую запись в таблице Inventory;
• D – удалить существующую запись из таблицы Inventory;
• L – вывести информацию об имеющемся наборе автомобилей, используя объект чтения данных;
• S – показать эти варианты выбора пользователю;
• Q - выйти из программы.
Каждый возможный вариант обрабатывается своим уникальным статическим методом в рамках класса Program. Для полной ясности вот реализация Main(), которая, как кажется, не требует никаких дополнительных комментариев.
static void Main(string[] args) {
Console.WriteLine ("***** Модификатор Inventory для Car *****");
bool userDone = false;
string userCommand = "";
SqlConnection cn = new SqlConnection();
cn.ConnectionString = "uid=sa;pwd=;Initial Catalog=Cars;" +
"Data Source=(local);Connect Timeout=30";
cn.Open();
ShowInstructions();
do {
Console.Write("Введите команду: ");
userCommand = Console.ReadLine();
Console.WriteLine();
switch (userCommand.ToUpper()) {
case "I":
InsertNewCar(cn);
break;
case "U":
UpdateCarPetName(cn);
break;
case "D":
DeleteCar(cn);
break;
case "L":
ListInventory(cn);
break;
case "S":
ShowInstructions();
break;
case "Q":
userDone = true;
break;
default:
Console.WriteLine("Некорректные данные! Введите другие");
break;
}
} while (!userDone);
cn.Close();
}
Метод ShowInstructions() делает то, что и следует ожидать.
private static void ShowInstructions() {
Console.WriteLine();
Console.WriteLine("I: добавление новой машины.");
Console.WriteLine("U: модификация имеющейся машины.");
Console.WriteLine("D: удаление имеющейся машины.");
Console.WriteLine("L: список наличных машин.");
Console.WriteLine("S: вывод инструкций.");
Console.WriteLine('Q: выход из программы.");
}
Как уже упоминалось, метод ListInventorу() печатает строки таблицы Inventory с помощью объекта чтения данных (соответствующий программный код аналогичен программному коду предыдущего примера CarsDataReader).
private static void ListInventory(SqlConnection cn) {
string strSQL = "Select * From Inventory";
SqlCommand myCommand = new SqlCommand(strSQL, cn);
SqlDataReader myDataReader;
myDataReader = myCommand.ExecuteReader();
while (myDataReader.Read()) {
for (int i = 0; i ‹ myDataReader.FieldCount; i++) {
Console.Write("{0} = {1}"; myDataReader.GetNаmе(i), myDataReader.GetValue(i).ToString().Trim());
}
Console.WriteLine();
}
myDataReader.Close();
}
Итак, текстовый интерфейс пользователя готов, и мы можем теперь перейти к более интересным вещам.