Почему вызов моего запроса UPDATE в базе данных Access через OleDb не работает? - PullRequest
3 голосов
/ 14 марта 2009

Обновление 2: я решил это, см. Мой ответ.


Я вызываю запросы в базе данных Microsoft Access из C # с помощью OleDb, но не могу заставить работать мои запросы на обновление.

Ошибка не выдается, но обновления не сохраняются в базе данных.

Может кто-нибудь пролить свет на это?


SQL-запрос в базе данных:

UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtg
WHERE tableName.key = ID;

C #:

OleDbCommand command = new OleDbCommand();
SetCommandType(command, CommandType.StoredProcedure, "NameOfQueryInAccessDatabase");
AddParamToSQLCmd(command, "@ID", OleDbType.Integer, 4, ParameterDirection.Input, id);
AddParamToSQLCmd(command, "@LastPolledDtg", OleDbType.Date, 4, ParameterDirection.Input, DateTime.Now);
using (OleDbConnection connection = new OleDbConnection("connectionString"))
{
command.Connection = connection;
connection.Open();
result = command.ExecuteNonQuery();
}

Строка подключения:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Documents and Settings\\Administrator\\Desktop\\dev\\src\\Website\\App_Data\\tracking.mdb"

Обновление 1:

Я пытался сузить возможности, создав новую базу данных, содержащую одну таблицу и один запрос, и убедившись, что доступ закрыт, когда я запускаю C # для обновления таблицы.

Обновление по-прежнему не выполняется. Я подозреваю, что это проблема синтаксиса (также может быть проблема с разрешениями?), Но без каких-либо сообщений об ошибках довольно сложно отладить!

Ответы [ 4 ]

5 голосов
/ 14 марта 2009

Только что решил проблему - это было именование параметров - кажется, вы не можете назвать параметры в запросе так же, как любое из полей.

Изменение запроса с:

UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtg
WHERE tableName.key = ID;

до:

UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtgArg
WHERE tableName.key = ID; 

... и обновление вызывающего C # с изменением имени параметра приводит к его записи в базу данных.

НО, была еще одна маленькая неприятность: оставив порядок параметров в C # как есть, заставил поле LastPolledDtg в базе данных обновляться с минимальной датой (1899 или что-то). Переупорядочивание добавления параметров в OleDbCommand для соответствия их появлению в SQL исправило это.

Так что C # должен выглядеть так:

OleDbCommand command = new OleDbCommand();
SetCommandType(command, CommandType.StoredProcedure, "NameOfQueryInAccessDatabase");
AddParamToSQLCmd(command, "@LastPolledDtgArg", OleDbType.Date, 4, ParameterDirection.Input, DateTime.Now);
AddParamToSQLCmd(command, "@ID", OleDbType.Integer, 4, ParameterDirection.Input, id);
using (OleDbConnection connection = new OleDbConnection("connectionString"))
{
command.Connection = connection;
connection.Open();
result = command.ExecuteNonQuery();
}

Человек, которого я люблю Access.

3 голосов
/ 14 марта 2009

Ваш запрос на обновление немного сбивает с толку (вы используете LastPolledDtg в качестве поля и в качестве значения для него). Если вы имеете в виду параметр для определения столбца, он не будет работать.

В противном случае попробуйте переписать ваш запрос в Access, используя синтаксис PARAMETER, например:

PARAMETERS LastPolledDtgArg Text ( 255 ), ID Long;
UPDATE tableName SET tableName.LastPolledDtg = [LastPolledDtgArg]
WHERE tableName.key = [ID];

Если это не сработает, попробуйте использовать SQL для запроса непосредственно из C # вместо того, чтобы пытаться выполнить сохраненный запрос.

Что-то еще

Переупорядочьте параметры так, чтобы они передавались в том же порядке, в котором они определены в Запросе, чтобы вы передали значение для LastPolledDtArg до ID.

1 голос
/ 28 августа 2013

В ms-access * параметры должны быть в том же порядке, что и оператор SQL .

0 голосов
/ 14 марта 2009

Я не кодер Access, но, похоже, могут использоваться неявные транзакции. Это будет означать, что когда вы выполняете команду изменения данных, автоматически открывается транзакция, которая должна быть явно зафиксирована / откатана в вашем коде.

Либо это, либо по какой-то причине на обновление не влияет ни одна строка.

...