Команда вставки адаптера данных 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);