Не работает сохранение в БД ADO
Не получается сохранить изменения сделанные в datagridview в базу данных.
public partial class Form1 : Form
{
DataTable dbTable = new DataTable();
SqlDataAdapter dbAdp = new SqlDataAdapter();
SqlCommand dbCmd = new SqlCommand();
SqlConnection sqlConn = new SqlConnection();
SqlCommand cmd = new SqlCommand();
public Form1()
{
InitializeComponent();
}
public void Form1_Load(object sender, EventArgs e)
{
SqlConnection sqlConn = new SqlConnection("Data Source=wpl27.hosting.reg.ru; Initial Catalog=u1236799_BallOSP5; User ID=****;Password=****");
sqlConn.Open();
dbAdp.SelectCommand = dbCmd;
dbAdp.Fill(dbTable);
dataGridView1.DataSource = dbTable;
dataGridView1.Columns[0].Visible = false;
dataGridView1.Columns[7].Visible = false;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}
private void SaveupdateButton_Click(object sender, EventArgs e)
{
sqlConn = new SqlConnection("Data Source=wpl27.hosting.reg.ru; Initial Catalog=u1236799_BallOSP5; User ID=*****;Password=*****");
sqlConn.Open();
dbAdp.UpdateCommand = new SqlCommand("UPDATE OSP5 SET Client = @Client ", sqlConn);
// cmd.Parameters.Add("@Client", SqlDbType.NChar, 50, "Client");
cmd.Parameters.AddWithValue("@Client", "Client");
dbAdp.UpdateCommand = cmd;
}
Ответы (5 шт):
Думаю, Вам нужно для начала правильно сформировать SQL запрос и выполнить его.
Как-то так:
string connectionString = "Data Source=wpl27.hosting.reg.ru; Initial Catalog=u1236799_BallOSP5; User ID=*****;Password=*****";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
dbAdp.UpdateCommand = new SqlCommand("UPDATE OSP5 SET Client = @Client ", connection);
dbAdp.UpdateCommand.Parameters.AddWithValue("@Client", "Client");
dbAdp.UpdateCommand.ExecuteNonQuery();
}
Думаю уже после этого всё должно заработать.
сначала создать команду, потом добавить её в UpdateCommand:
private void SaveupdateButton_Click(object sender, EventArgs e)
{
sqlConn = new SqlConnection("Data Source=wpl27.hosting.reg.ru; Initial Catalog=u1236799_BallOSP5; User ID=*****;Password=*****");
sqlConn.Open();
cmd = new SqlCommand("UPDATE OSP5 SET Client = @Client ", sqlConn);
cmd.Parameters.AddWithValue("@Client", "Client");
dbAdp.UpdateCommand = cmd;
dbAdp.UpdateCommand.ExecuteNonQuery();
sqlConn.Close();
}
Но у Вас скорее всего ошибка в sql запросе, полный запрос должен быть скорее всего такой:
cmd = new SqlCommand("UPDATE OSP5 SET Client = @Client WHERE ClientID = @ClientID", sqlConn);
по событию изменения данных о клиенте, должны меняться существующие переменные для подставляемых значение например:
//string ChangedClientBody - сюда после изменения и перед обновлением бд должно записаться - Ваше - Client = @Client
//int IDChangedClient - а сюда Ваше ClientID = @ClientID;
далее эти переменные должны передаваться в параметры запроса:
cmd.Parameters.AddWithValue("@Client", ChangedClientBody);
cmd.Parameters.AddWithValue("@ClientID", IDChangedClient);
dbAdp.UpdateCommand = cmd;
dbAdp.UpdateCommand.ExecuteNonQuery();
sqlConn.Close();
В вашем коде множество недостатков. Объяснять все не стану, т. к. это не формат нашего сайта.
Опишу лишь, как сделать вашу задачу кратчайшим способом. Как я понял, вы хотите обновить в БД те данные, которые пользователь изменил в датагриде, к которому привязан DataTable.
Вы используете SqlDataAdapter - вот его и возьмём за основу. При этом не нужны поля SqlCommand dbCmd, SqlConnection sqlConn, SqlCommand cmd - их просто удаляем.
Строку соединения с базой данных не стоит описывать в каждом методе. Ведь при малейшем её изменении придётся искать все эти места и исправлять. Вынесем её в поле.
Ещё лучше строку соединения читать из конфига. Но это оставим на потом.
При создании SqlDataAdapter нужно задать как минимум sql-запрос select. Это позволит получать данные из БД в DataTable.
А для обновления, удаления и вставки нужно, соответственно, задать sql-запросы update, delete, insert. Это можно сделать как вручную, так и сгенерировать автоматически с помощью класса SqlCommandBuilder. Он не сможет сгенерировать запросы, если селект был из нескольких таблиц с джойнами и т. п. Но в вашем случае, вероятно, справится.
Ну и всё. Далее просто используем адаптер.
public partial class Form1 : Form
{
string connectionString = @"тут строка соединения";
DataTable dbTable = new DataTable();
SqlDataAdapter dbAdp;
public Form1()
{
InitializeComponent();
dbAdp = new SqlDataAdapter("select * from OSPS", connectionString);
// Здесь будут сгенерированы запросы update, insert, delete
var builder = new SqlCommandBuilder(dbAdp);
// Можно посмотреть, что там сгенерировалось
// MessageBox.Show(builder.GetUpdateCommand().CommandText);
}
public void Form1_Load(object sender, EventArgs e)
{
dbAdp.Fill(dbTable);
dataGridView1.DataSource = dbTable;
dataGridView1.Columns[0].Visible = false;
dataGridView1.Columns[7].Visible = false;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}
private void SaveUpdateButton_Click(object sender, EventArgs e)
{
dbAdp.Update(dbTable);
}
}
Полезные ссылки:
Updating Data Sources with DataAdapters
Generating Commands with CommandBuilders
И ещё. Почему не стоит использовать метод AddWithValue:
Can we stop using AddWithValue() already?
AddWithValue is evil!
AddWithValue is Evil
Достаточно прочитать любую из этих статей.
private void SaveupdateButton_Click(object sender, EventArgs e)
{
var dbAdp = new SqlDataAdapter();
SqlCommand cmd = new SqlCommand();
int IDChangedClient=0;
string ChangedClientBody="";
string connectionString = "Data Source=wpl27.hosting.reg.ru; Initial Catalog=u1236799_BallOSP5; User ID=*****;Password=****";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
cmd = new SqlCommand("UPDATE OSP5 SET Client = @Client WHERE OSP5ID = @OSP5ID", connection);
cmd.Parameters.AddWithValue("@Client", ChangedClientBody);
cmd.Parameters.AddWithValue("@OSP5ID", IDChangedClient);
dbAdp.UpdateCommand = cmd;
dbAdp.UpdateCommand.ExecuteNonQuery();
connection.Close();
}
}
И так не сохраняет :(
string query = "SELECT * FROM dbo.bimar";
da = new SqlDataAdapter(query, connectionString);
SqlCommandBuilder cBuilder = new SqlCommandBuilder(da);
dt = new DataTable();
da.Fill(dt);
BindingSource bSource = new BindingSource();
bSource.DataSource = dt;
dataGridView1.DataSource = bSource;
когда вы изменяете свои данные в dataGridView1 , обновите их:
private void button1_Click(object sender, EventArgs e)
{
da.Update(dt);
}
Это решение мне помогло. Может кому-то пригодится. Теперь изменения сделанные в DatagridView сохраняются