Обновление таблицы доступа из кода C # - PullRequest
0 голосов
/ 23 мая 2018

Я хочу обновить поле на основе условияесли возраст <25, то класс = 10, а класс = 20;<br> до сих пор я пробовал эти

 cmd = new OleDbCommand("update workClass Set Class = 10  when " + ds.Tables["no"].Rows[i][1] + " < 25   else Set Class =  20 ", con);
 cmd.ExecuteNonQuery();

секунду

cmd = new OleDbCommand("update workClass Set Class = 10  where" + ds.Tables["no"].Rows[i][1] + " < 25   else Set Class =  20 ", con);
     cmd.ExecuteNonQuery();

Я получаю это сообщение об ошибке
обратите внимание, что ds.tables возвращает 33 в первой итерации, такэтот бит работает нормально

Синтаксическая ошибка (отсутствует оператор) в выражении запроса '10, когда 33 <25 else Class = 20 '. </p>

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

У меня такое ощущение, что это то, что вам нужно.

cmd = new OleDbCommand("UPDATE workClass SET [Class] = IIF([Age] < 25, 10, 20)", con);
cmd.ExecuteNonQuery();

Чего не хватает, так это дескриптора, поэтому вы обновляете только определенную запись или набор записей на основе фильтра.Как написано у вас есть запрос, и этот обновляет все записи каждый раз, когда он выполняется.Чтобы добавить предложение where, обязательно добавьте фильтр с использованием параметра и не используйте конкатенацию строк.

Пример:

cmd = new OleDbCommand("UPDATE workClass SET [Class] = IIF([Age] < 25, 10, 20) WHERE [someId] = ?", con);
cmd.Parameters.Add("@someId", OleDbType.Integer).Value = yourIdValue;
cmd.ExecuteNonQuery();

Важно отметить, что параметрызаказаны в Ms Access и не названы.Первый параметр, встречающийся в запросе, должен соответствовать первому параметру в коллекции параметров.

0 голосов
/ 23 мая 2018

В механизме JET, поддерживающем базу данных Microsoft Access, нет предложения WHEN.
Вам необходимо использовать IIF-функцию , например,

cmd = new OleDbCommand(@"update workClass Set Class = IIF(" + 
    ds.Tables["no"].Rows[i][1] + " < 25, 10, 20)", con);

Однако я предлагаю вамиспользовать параметризованный запрос, чтобы избежать возможной ошибки синтаксического анализа и sql Injection

cmd = new OleDbCommand(@"update workClass Set Class = IF(@value < 25, 10, 20)", con);
cmd.Parameters.Add("@value", OleDbType.Integer).Value = 
    Convert.ToInt32(ds.Tables["no"].Rows[i][1]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...