通过 datagridview 实时更新 MDB 数据库
Posted
技术标签:
【中文标题】通过 datagridview 实时更新 MDB 数据库【英文标题】:Realtime updating MDB database through a datagridview 【发布时间】:2013-02-28 09:47:12 【问题描述】:我目前正在尝试创建一个小程序,该程序从显示在 datagridview 中的 MDB 数据库中获取数据。该程序应允许用户修改(添加、更新、删除)datagridview 中的数据。此外,所有内容都应自动更新到 MDB(无按钮)。我知道有很多关于这个主题的话题,但是由于某种原因我无法重现相同的结果。
我能够从 MDB 文件中检索数据并将其显示在 datagridview 中,但我无法添加、修改或删除数据。程序不断向我抛出异常,但我不明白为什么。
首先用户必须创建一个数据库。数据库由代码自动生成。
private void CreateNewDatabase_Click(object sender, EventArgs e)
string DB_FILENAME = "c:\Test.mdb";
// GENERATE THE ACCESS FILES, ITS TABLES AND ITS COLUMNS
var cnnStr = "Provider=Microsoft.Jet.OLEDB.4.0.;Data Source=" + DB_FILENAME; //Use a late bound COM object to create a new catalog. This is so we avoid an interop assembly
var catType = Type.GetTypeFromProgID("ADOX.Catalog");
object o = Activator.CreateInstance(catType);
catType.InvokeMember("Create", System.Reflection.BindingFlags.InvokeMethod, null, o, new object[] cnnStr );
OleDbConnection cnn = new OleDbConnection(cnnStr);
cnn.Open();
var cmd = cnn.CreateCommand();
// CREATE SCHEDULE TABLE
cmd.CommandText = "CREATE TABLE SCHEDULE ([ID] IDENTITY PRIMARY KEY, [Day] TEXT, [Month] TEXT, [Year] TEXT, [IMS] TEXT, [Customer] TEXT, [Short Description] TEXT, [Long Description] TEXT, [Delivery Ticket Number] TEXT, [Returned] TEXT)";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO SCHEDULE ([ID]) VALUES (1)";
cmd.ExecuteNonQuery();
// DISPOSE OF THE VARIABLES USED
cnn.Close();
cnn.Dispose();
cmd.Dispose();
一旦创建了数据库,它就会在带有 datagridview 的 windows 窗体中使用。
public void Initialize()
Con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sttngs.DBloc);
Con.Open();
// TRY TO OPEN THE DATABASE FILE AND POPULATE THE DATAGRIDVIEW
da = new OleDbDataAdapter("SELECT [Day], [Month], [Year], [IMS], [Customer], [Short Description], [Long Description], [Delivery Ticket Number], [Returned] FROM SCHEDULE",Con); // WHERE [Returned] = '" + "NO' ", Con);
// POPULATE cBuilder
cBuilder = new OleDbCommandBuilder(da);
ScheduleData = new DataTable();
da.Fill(ScheduleData);
if (ScheduleData.Rows.Count > 0)
BindingSource BDS = new BindingSource();
BDS.DataSource = ScheduleData;
this.dataGridView.DataSource = BDS;
一旦 datagridview 中的数据发生更改(由 CellValidating 事件处理),则应在 MDB 中更新数据。
private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
if (ScheduleData.GetChanges() != null)
dataGridView.EndEdit();
da.Update(ScheduleData);
ScheduleData.AcceptChanges();
代码非常简单,但由于某种原因,我无法弄清楚为什么 MDB 中的数据没有更新。我已经被困了一段时间,所以任何帮助都会很棒!
【问题讨论】:
【参考方案1】:我可以看到会导致问题的一件事是,当您设置命令构建器时,您没有请求相关的 UPDATE、DELETE 和 INSERT 命令。
当您像这样生成命令生成器时:-
cBuilder = new OleDbCommandBuilder(da);
跟进:-
cBuilder.GetUpdateCommand();
cBuilder.GetInsertCommand();
cBuilder.GetDeleteCommand();
您可能需要在 Cell Validating 中声明所有这些,我不确定。试一试。
查看这篇 MSDN 文章,它适用于 SQLcommamdbuilder,但适用相同的规则:-
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommandbuilder.aspx
另外,当您尝试更新数据适配器时,您没有打开连接:-
if (ScheduleData.GetChanges() != null)
dataGridView.EndEdit();
//Open a connection Here
da.Update(ScheduleData);
ScheduleData.AcceptChanges();
您的 SQL 字符串不正确,请尝试:-
"SELECT (Day, Month, Year, IMS, Customer, Short Description, Long Description, Delivery Ticket Number, Returned) FROM [SCHEDULE]"
【讨论】:
Derek,我的连接已打开,因为我已将其公开。它在初始化过程中打开,并在表单关闭时关闭。 我也尝试实现更新、插入和删除命令,但这似乎仍然不起作用。它只是崩溃并说它无法执行更新语法。还有其他建议吗?以上是关于通过 datagridview 实时更新 MDB 数据库的主要内容,如果未能解决你的问题,请参考以下文章
如何通过存储过程和 DatagridView 更新键填充值?