2017-02-09 6 views
0

У меня есть форма, созданная программно, который содержит TextBox связанный с DataTable. Я использую базу данных Chinook. Некоторое поведение в порядке (чтение базы данных), но я не могу сохранить изменения в базе данных. Я не знаю, что случилось.C таблицы базы данных # обновление образуют форму, созданную программно

код SQL является (я использую SQL Server 2014):

CREATE TABLE [dbo].[Artist] 
(
    [ArtistId] INT NOT NULL, 
    [Name] NVARCHAR(120), 
    CONSTRAINT [PK_Artist] PRIMARY KEY CLUSTERED ([ArtistId]) 
); 
GO 

INSERT INTO [dbo].[Artist] ([ArtistId], [Name]) VALUES (1, N'AC/DC'); 
INSERT INTO [dbo].[Artist] ([ArtistId], [Name]) VALUES (2, N'Accept'); 
INSERT INTO [dbo].[Artist] ([ArtistId], [Name]) VALUES (3, N'Aerosmith'); 
INSERT INTO [dbo].[Artist] ([ArtistId], [Name]) VALUES (4, N'Alanis Morissette'); 
INSERT INTO [dbo].[Artist] ([ArtistId], [Name]) VALUES (5, N'Alice In Chains'); 
INSERT INTO [dbo].[Artist] ([ArtistId], [Name]) VALUES (6, N'Antônio Carlos Jobim'); 
INSERT INTO [dbo].[Artist] ([ArtistId], [Name]) VALUES (7, N'Apocalyptica'); 
INSERT INTO [dbo].[Artist] ([ArtistId], [Name]) VALUES (8, N'Audioslave'); 
INSERT INTO [dbo].[Artist] ([ArtistId], [Name]) VALUES (9, N'BackBeat'); 
... 

код является (только новый проект с кнопкой в ​​нем):

public partial class Form1 : Form 
{ 
    private SqlConnection con = new SqlConnection(); 
    protected Form FForm; 
    private SqlCommand FSqlCommand = new SqlCommand(); 
    protected BindingSource FBindingSource = new BindingSource(); 
    protected SqlDataAdapter FSqlDataAdapter = new SqlDataAdapter(); 
    protected DataSet FDataSet = new DataSet(); 
    protected DataTable FDataTable = new DataTable(); 

    public Form1() 
    { 
     InitializeComponent(); 
     con.ConnectionString = "Data Source=***; Initial Catalog=Chinook; User ID=sa; Password=***"; 
     con.Open(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     FForm = new Form(); 
     FForm.Visible = true; 

     FSqlDataAdapter = new SqlDataAdapter("SELECT * FROM Artist", con); 
     FSqlDataAdapter.Fill(FDataTable); 
     FBindingSource.DataSource = FDataTable; 

     TextBox tb = new TextBox(); 
     tb.DataBindings.Add("Text", FBindingSource, "name", true); 
     tb.Left = 16; 
     tb.Top = 16; 
     tb.Width = 100; 
     FForm.Controls.Add(tb); 

     Button btnSave = new Button(); 
     btnSave.Text = "Save"; 
     btnSave.Left = 16; 
     btnSave.Top = 48; 
     btnSave.Width = 75; 
     FForm.Controls.Add(btnSave); 
     btnSave.Click += btnSave_Click; 
    } 

    private void btnSave_Click(object sender, EventArgs e) 
    { 
     SqlCommandBuilder cb = new SqlCommandBuilder(FSqlDataAdapter); 
     FSqlDataAdapter.Update(FDataTable); 
     FForm.Close(); 
    } 
} 
+0

Любые исключения или таблицы просто пустой/не обновляется? – cassandrad

+0

@cassandrad: Таблицы заполнены исходными данными. Первым художником является AC/DC – jciberta

ответ

-1

Потому что внутри вашего btnSave_Click - это var FSqlDataAdapter, где есть запрос внутри него: «Выберите * от исполнителя».

Вы должны использовать запрос на обновление, чтобы иметь возможность обновлять свои данные в базу данных

+0

'SqlCommandBuilder' должен создать' UpdateCommand', если 'SelectCommand'is установлен – Pikoh

+0

oh. теперь я знаю. –

0

Попробуйте (отредактированный) вместо:

private void btnSave_Click(object sender, EventArgs e) 
    { 
     using (var con = new SqlConnection("Data Source=***; Initial Catalog=Chinook; User ID=sa; Password=***")) 
     using (new SqlCommandBuilder(FDataTable)) 
     { 
      adapter.Fill(table); 
      con.Open(); 
      adapter.Update(table); 
     } 
    } 

Я din't видеть соединение установить в кнопке. Также: не открывайте свое соединение. Всегда используйте using(), поэтому ваше соединение будет закрыто, если не нужно. В качестве примера: ваше программное обеспечение становится большим и сложным во многих заявлениях sql, и внезапно он падает. До сих пор существует соединение, доступное для вашего SQL Server. С using() он будет закрыт, как только он закончится.

Также: это экономит пространство, но это важно при написании большого программного обеспечения.

+0

Не работает. Все еще не вносит никаких изменений в базу данных. Соединение было открыто конструктором, но спасибо за совет – jciberta

+0

@jciberta Hm. На самом деле мой код ошибочен. Вы вносите изменения в адаптер? Например, в моем коде я просто получаю все из базы данных и обновляю его. Это не внесет никаких изменений. Можете ли вы показать нам, как вы получаете обновленную запись в таблицу? Допустим, у вас есть GridView. Получаете ли вы все записи и вставляете их в свой адаптер? – Cataklysim

+0

Это целый код. Форма с текстовым полем, привязанным к таблице. Я предполагаю, что SqlCommandBuilder создает команду UPDATE, поэтому FSqlDataAdapter.Update (FDataTable) должен обновить таблицу. Я ошибаюсь? – jciberta

0

Я нашел то, чего не хватает. Перед изменениями обновления вам необходимо «Применять ожидающие изменения в базовый источник данных» с помощью метода EndEdit.

Таким образом, он работает с:

private void btnSave_Click(object sender, EventArgs e) 
    { 
     FBindingSource.EndEdit(); 
     SqlCommandBuilder cb = new SqlCommandBuilder(FSqlDataAdapter); 
     FSqlDataAdapter.Update(FDataTable); 
     FForm.Close(); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^