Как игнорировать ошибку SQL? - C # - PullRequest
0 голосов
/ 28 октября 2009

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

Редактировать Без использования try / catch

См. этот вопрос , почему я хочу игнорировать ошибку.

Ответы [ 5 ]

0 голосов
/ 06 ноября 2012

Используйте сохраненный процесс для этого следующим образом. Обратите внимание, что error_number() от определенной ошибки - при вставке дубликата с уникальными ключами или ограничением PK. Google, если вы хотите получить более подробную информацию о конкретных номерах

BEGIN TRY
    insert into table values(x,y,x)
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() = 2627 OR ERROR_NUMBER() = 2601
             -- this is a duplicate so just do nothing
    ELSE
         RAISERROR ('Error with Insert', -- Message text.
            16, -- Severity.
            1 -- State.
            );
END CATCH
0 голосов
/ 28 октября 2009

Там действительно нет никакого способа без первоначального выбора или попытки поймать ...

Если вы используете БД, которая поддерживает хранимые процедуры, вы можете значительно сократить накладные расходы на инициализацию, выполнив выборку в хранимой процедуре, а затем вставляя ее только при отсутствии записей.

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

    Insert TableName ([column list])
Select Distinct @PK, @valueA, @ValueB, etc. -- list all values to be inserted
From TableName
Where Not Exists 
    (Select * From TableName
     Where PK == @PK)
0 голосов
/ 28 октября 2009

Если вы хотите игнорировать это, перехватите SqlException и проглотите его ...

  try 
  {

      // code that calls the database insert
  }
  catch(SqlException) { /* swallow */ }

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

If Not Exists (Select * From Table
               Where PK = @PkValue)
    Insert Table (ColNames here) 
    Values(input parameters here, including PKvalue)
0 голосов
/ 28 октября 2009

Использование:

try {
  ...sql statement execution...
} catch (SqlException ex) { 
  ..do stuff here...
}
0 голосов
/ 28 октября 2009

Используйте Try / Catch и ничего не делайте на улове.

Конечно, это означает, что запись не будет вставлена, и при этом она не решит основную проблему, упомянутую @recursive, но она проигнорирует ошибку.

Если вы хотите вставить новую строку, избавьтесь от значений свойств, которые приводят к тому, что это происходит как поле Id или что-то в этом роде.

Редактировать

Если это счетчик посещений, то вы хотите сделать запрос на обновление, который, я думаю, откуда вы пришли. Вы не хотите делать проверку, а затем либо вставить / обновить правильно?

Я думаю, вам лучше использовать хранилище данных и хранить объекты в памяти. если для объекта назначен идентификатор, то вы обновляете счетчик, если нет - вставку и сохраняете идентификатор вместе с объектом.

А как насчет Google Analytics для проверки количества посещений на страницах? Много проще, в основном бесплатно и почти без кода. это то, что может быть жизнеспособным?

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