Как проверить наличие ошибок при выполнении SQL-запроса DataAdapter / DataSet? - PullRequest
0 голосов
/ 08 июля 2010

Вот так я обновляю таблицу, используя 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, укажите, пожалуйста,это также.

Большое спасибо,

Тодд

1 Ответ

2 голосов
/ 08 июля 2010

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

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

cmd.ExectureNonQuery();

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

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);   
}
...