C#update database table形成一个以编程方式创建的表单

时间:2017-02-09 09:30:23

标签: c# ado.net

我创建了一个以编程方式创建的表单,其中包含绑定到 DataTable TextBox 。我正在使用Chinook数据库。一些行为是正常的(读取数据库),但我无法保存数据库上的更改。我不知道出了什么问题。

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();
    }
}

3 个答案:

答案 0 :(得分:0)

试试这个(EDITED):

    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);
        }
    }

我看不到按钮中建立的连接。另外:不要让你的连接打开。始终使用using(),以便在不需要时关闭您的连接。例如:你的软件变得庞大而复杂,有许多sql语句,突然间,它崩溃了。仍然有一个连接打开您的SQL Server。使用using()时,它会在结束后立即关闭。

另外:它节省了一些空间,但是当你编写大软件时这很重要。

答案 1 :(得分:0)

我发现了什么遗失了。在更新更新之前,您需要使用EndEdit方法“对基础数据源应用挂起的更改”。

所以,它适用于:

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

答案 2 :(得分:-1)

因为你的btnSave_Click里面是var FSqlDataAdapter所在的位置 里面的查询是"从艺术家"中选择*。

您必须使用更新查询才能将数据更新到数据库