Команда вставки адаптера данных SQL

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

DataTable dtUsers = new DataTable("tblUsers");
BindingSource bsUsers = new BindingSource();
SqlDataAdapter daUsers = new SqlDataAdapter("usp_GetUsers", Properties.Resources.ConnectionString);


     daUsers.InsertCommand = new SqlCommand("usp_InsertNewUser");
                daUsers.InsertCommand.Connection = new SqlConnection(Properties.Resources.ConnectionString);
                daUsers.InsertCommand.CommandType = CommandType.StoredProcedure;
                daUsers.InsertCommand.Parameters.Clear();
                daUsers.InsertCommand.Parameters.Add("@username", SqlDbType.VarChar, 50).Value = txtUser.Text;
                daUsers.InsertCommand.Parameters.Add("@password", SqlDbType.VarChar, 50).Value = txtPass.Text;
                daUsers.InsertCommand.Parameters.Add("@userType", SqlDbType.Int).Value = cbxUserType.SelectedValue;
                daUsers.Update(dtUsers);

И прежде чем вы спросите, хранимая процедура работает нормально. А также, если я изменю вышеуказанный InsertCommand на SelectCommand и вызову метод Fill, то все будет отлично! Это неприятно, так как методы вставки / обновления адаптера данных не работают должным образом, если вы используете комбинацию выбора / заполнения. Строки данных не вставляются, так как я это тоже отслеживал. Также не генерируются исключения. Al

2 ответа

С этим точным фрагментом кода ничего не будет вставлено - метод SqlDataAdapter.Update() работает для каждого DataRow во входящем элементе данных (dtUsers), для которого имеется RowState of Added, он будет вызывать InsertCommand, который был определен в адаптере данных, Аналогично, для каждого DataRow с RowState of Modified он будет вызывать определенную команду UpdateCommand (если она есть).

Целью SqlDataAdapter.Update() является предоставление DataTable (потенциально содержащего новые, обновленные и удаленные строки), для которого он будет вызывать соответствующий определенный sproc.

Таким образом, в вашем коде у вас нет ничего в dtUsers с RowState of Added, и поэтому нет никакой работы для отправки в БД.... поэтому ничего не вставляется.

Вы можете использовать adapter.InsertCommand.ExecuteNonQuery() после установки параметров для фиксации вставки в базу данных.

Например:

DataTable dtUsers = new DataTable("tblUsers");
BindingSource bsUsers = new BindingSource();
SqlDataAdapter daUsers = new SqlDataAdapter("usp_GetUsers",Properties.Resources.ConnectionString);
daUsers.InsertCommand = new SqlCommand("usp_InsertNewUser");
daUsers.InsertCommand.Connection = new SqlConnection(Properties.Resources.ConnectionString);
daUsers.InsertCommand.CommandType = CommandType.StoredProcedure;
daUsers.InsertCommand.Parameters.Clear();
daUsers.InsertCommand.Parameters.Add("@username", SqlDbType.VarChar, 50).Value = txtUser.Text;
daUsers.InsertCommand.Parameters.Add("@password", SqlDbType.VarChar, 50).Value = txtPass.Text;
daUsers.InsertCommand.Parameters.Add("@userType", SqlDbType.Int).Value = cbxUserType.SelectedValue;
daUsers.InsertCommand.ExecuteNonQuery();
daUsers.Update(dtUsers);
Другие вопросы по тегам