Как проверить наличие ошибок при выполнении SQL-запроса DataAdapter/DataSet?

Вот как я обновляю таблицу с помощью DataAdapter и DataSet в VB с помощью SQL Server:

sqlStmt = String.Format("INSERT INTO my_table (name, lastname) VALUES ('John', 'Doe')")
ds = New DataSet
da = New SqlDataAdapter(sqlStmt, My.Settings.ConnectionString)
da.Fill(ds)

Я знаю, что метод Fill не имеет смысла в случае оператора INSERT, но я новичок в этой технологии, и приведенный выше оператор выполняет свою работу и обновляет таблицу без проблем. Мой вопрос заключается в следующем: если произошла ошибка (скажем, ошибка двойного ключа), как я узнаю об этом в своем приложении? Должен ли я помещать приведенный выше код в блок try/catch?

Кроме того, если существует правильный метод для выполнения инструкций INSERT с использованием комбинации DataAdapter/DataSet, которая не использует метод Fill, также укажите это.


person Sabuncu    schedule 08.07.2010    source источник
comment
Для начала используйте теги ‹code› ‹/code› при размещении кода :) Либо выделите код и нажмите Ctrl+K :)   -  person Ranhiru Jude Cooray    schedule 08.07.2010
comment
@Ranhiru, спасибо, что показали мне, как это делается, только что отредактировал и исправил форматирование.   -  person Sabuncu    schedule 09.07.2010


Ответы (1)


Для операторов обновления следует использовать объект SqlCommand.

SqlCommand cmd = new SqlCommand( "INSERT INTO my_table (name, lastname) VALUES ('John', 'Doe')", My.Settings.ConnectionString);

cmd.ExectureNonQuery();

Однако рекомендуется использовать параметризованные SQL-запросы, если вы случайно получаете данные от пользователя, чтобы уменьшить вероятность атак SQL Injection :)

SqlCommand cmd = new SqlCommand( "INSERT INTO my_table (name, lastname) VALUES (@FirstName, @LastName)", My.Settings.ConnectionString);

cmd.Parameters.Add("FirstName", SqlDbType.NVarChar);
cmd.Parameters.Add("LastName", SqlDbType.NVarChar);

cmd.Parameters[0].Value = txtFirstName.Text;
cmd.Parameters[1].Value = txtLastName.Text;

cmd.ExecuteNonQuery();

Ответ на другой ваш вопрос:

да. Если имело место нарушение первичного ключа, будет выдано исключение SQLException. Вы можете поймать его с помощью блока try-catch и показать сообщение или сделать что-то еще.

try
{
  cmd.ExecuteNonQuery();
}
catch (Exception ex)
{      
  MessageBox.Show("Error! " + ex.Message);   
}
person Ranhiru Jude Cooray    schedule 08.07.2010