Как использовать поле Auto Number в БД Access в операторе UPDATE в c #? - PullRequest
0 голосов
/ 26 февраля 2012

Я встретил эту ошибку, когда использовал это как мой OleDbCommand

"UPDATE [Players] SET [Players] = '" + sPlayerName + "' WHERE [ID] = '" + nPlayer + "'"

Error:
Database Error - Unable to Write:
System.Data.OleDb.OleDbException: Data type mismatch in criteria expression.
at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(Int32 hr)
at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
at System.Data.OleDb.OleDbCommand.ExecuteNonQuery()

этот ID в предложении WHERE является полем Auto number в базе данных доступа nPlayerявляется целочисленной переменной

, это работает, когда значение жестко запрограммировано, как это, например, если значение переменной nPlayer равно 3, тогда

"....... WHERE [ID] =  3"

может кто-нибудь сказать мне, как исправить эту ошибку

Ответы [ 2 ]

3 голосов
/ 26 февраля 2012

Это довольно просто

Data type mismatch in criteria expression.

Это означает, что вы передаете строку, и вы должны передать число

В этом случае вы не должны использовать одинарную кавычку в поле,поэтому предложение WHERE необходимо изменить с этого

..."WHERE [ID] = '" + nPlayer + "'"

на это

..."WHERE [ID] = " + nPlayer
1 голос
/ 26 февраля 2012

U не должен согласовывать ваш запрос, а вместо этого использовать dbparameters .. Как-то так

string sql = "UPDATE [Players] SET [Players] = ? WHERE [ID] = ?";
OleDbCommand cmd = new OleDbCommand(sql, conn);
cmd.Parameters.Add("@playerName", OleDbType.VarChar, 20).Value = sPlayerName;
cmd.Parameters.Add("@playerId", OleDbType.Integer).Value = 3;

conn.Open();
cmd.ExecuteNonQuery();

Почему? 2 причины

1) SQL-инъекция, когда игрок сможет ввести SQL-оператор в свое имя. Для справки см http://en.wikipedia.org/wiki/SQL_injection

2) Производительность, запрос будет таким же, и оптимизатору SQL не придется повторно анализировать план запроса для него. Для справки см http://www.codeproject.com/Articles/16994/Use-SQL-Parameters-to-Overcome-Ad-Hoc-Performance

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...