Прошу прощения если повторяюсь, но что то не могу найти ответа.есть таблица datagridview заполняется так :
//------Форма с DGV--------//
dgv_CustomSizes.DataSource = dal.clientSizes(Convert.ToInt32(dgv_customers.Rows[e.RowIndex].Cells[0].Value));
//---------класс работающий с БД---------//
static string querySelect = "select * from [customers_Sizes] where ID_customers = @ID";
private static DataSet recivedData;
static public SqlDataAdapter adapterSize = new SqlDataAdapter(querySelect, connectionString);
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(adapterSize);
public DataTable clientSizes(int ID)
{
DataTable table = new DataTable();
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand commSelect = new SqlCommand(querySelect, conn);
commSelect.Parameters.AddWithValue(@"ID", ID);
SqlDataAdapter adapterSize = new SqlDataAdapter(commSelect);
conn.Open();
recivedData = new DataSet();
adapterSize.Fill(recivedData);
adapterSize.Fill(table);
}
return table;
}
потом пользователь может поменять какие то ячейки в таблице и теперь нужно сохранить эти изменения в БД. метод для сохранения
public void setNewSizes()
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
adapterSize.UpdateCommand = cmdBuilder.GetUpdateCommand();
conn.Open();
adapterSize.Update(recivedData.Tables[0]);
}
}
при выполнении происходит ошибка - необходимо объявить скалярную переменную @ID.
Вопрос в принципе закрыт. Нужно было просто прописать update в адаптер. Я же хотел свалить эту обязанность на SqlCommandBuilder
adapterSize.UpdateCommand = cmdBuilder.GetUpdateCommand();
неправильно истолковав msdn. Строку обновления для адаптера в ЛЮБОМ случае нужно писать.
Однажды решал такую задачу. В общем, был у меня DataGridView
. В качестве DataSource
я вешал ему DataTable
, затем через adapter.Fill(...)
запиливал в него данные из БД, а когда в DataGridView
что-то менял, то это отображалось в моём DataTable
, и после этого я просто по кнопке вызывал метод adapter.Update(...)
, и передавал в него свой DataTable
. Successful.
private void MainForm_Load(object sender, EventArgs e)
{
try
{
referenceDgv.DataSource = Connector.receivedData.Tables[0];
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString(), ex.Source.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
}
private void updateBtn_Click(object sender, EventArgs e)
{
Connector.UpdateTable();
}
Ну и класс Connector:
public static DataSet receivedData;
private static SqlConnection connection = new SqlConnection(connectionString);
private static SqlDataAdapter adapter = new SqlDataAdapter(commandRead, connection);
private static SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(adapter);
public static void Read()
{
try
{
receivedData = new DataSet();
adapter.Fill(receivedData);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString(), ex.Source.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
if (connection.State != ConnectionState.Closed)
{
CloseConnection();
}
}
}
public static void UpdateTable()
{
try
{
adapter.Update(receivedData.Tables[0]);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString(), ex.Source.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally
{
if (connection.State != ConnectionState.Closed)
{
CloseConnection();
}
}
}
public static void CloseConnection()
{
if (connection.State != ConnectionState.Closed)
{
connection.Close();
}
}
Если непонятно, то поразбирайся в этом проекте: https://github.com/guitarhero1488/TakeYourChain
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть, определенный набор полей, которые должны автоматически обрабатываться через Jquery в соответствии с регуляркой, но этих полей много, и пришла...
Нужно получить индексы одного list<T> Знаю что есть метод IndexOf но он не работает(не выводит индексы) Для начала я создаю новый List<T> и переписываю...