我创建了一个以编程方式创建的表单,其中包含绑定到 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();
}
}
答案 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所在的位置 里面的查询是"从艺术家"中选择*。
您必须使用更新查询才能将数据更新到数据库