C# 使用Devexpress编辑远程MS Access数据库
我做错了什么?我试图显示远程数据库中的数据,并插入、编辑和删除数据。我正在连接的数据库是一个远程数据库,我成功地连接并查看了该数据库的信息。但是,当我插入语法来编辑数据时,我发现一个错误,请参阅本文底部。 我正在使用Devexpress调度器控制器查看约会以及编辑约会。 这是全部代码C# 使用Devexpress编辑远程MS Access数据库,c#,database,devexpress,C#,Database,Devexpress,我做错了什么?我试图显示远程数据库中的数据,并插入、编辑和删除数据。我正在连接的数据库是一个远程数据库,我成功地连接并查看了该数据库的信息。但是,当我插入语法来编辑数据时,我发现一个错误,请参阅本文底部。 我正在使用Devexpress调度器控制器查看约会以及编辑约会。 这是全部代码 public partial class MainWindow : Window { CarsDBDataSet dataSet; public MainWindow() {
public partial class MainWindow : Window
{
CarsDBDataSet dataSet;
public MainWindow()
{
InitializeComponent();
intSchedular();
}
private void intSchedular()
{
schudlerControl1.Storage.AppointmentStorage.Mappings.AllDay = "AllDay";
schudlerControl1.Storage.AppointmentStorage.Mappings.Description = "Description";
schudlerControl1.Storage.AppointmentStorage.Mappings.End = "EndTime";
schudlerControl1.Storage.AppointmentStorage.Mappings.Label = "Label";
schudlerControl1.Storage.AppointmentStorage.Mappings.Start = "StartTime";
schudlerControl1.Storage.AppointmentStorage.Mappings.Location = "Location";
schudlerControl1.Storage.AppointmentStorage.Mappings.ReminderInfo = "RemindderInfo";
schudlerControl1.Storage.AppointmentStorage.Mappings.Subject = "Subject";
schudlerControl1.Storage.AppointmentStorage.Mappings.Status = "Status";
schudlerControl1.Storage.AppointmentStorage.Mappings.Type = "EventType";
schudlerControl1.Storage.AppointmentStorage.Mappings.RecurrenceInfo = "RecurrenceInfo";
System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection()
{
ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data source= \\UNDERFOOT-PC\CalUnderFootDB\CarsDB.mdb"
};
con.Open();
OleDbCommand createCommand = new OleDbCommand("select * from CarScheduling", con);
createCommand.ExecuteNonQuery();
OleDbDataAdapter adapter = new OleDbDataAdapter(createCommand);
CarsDBDataSet dataSet = new CarsDBDataSet();
// Bind the scheduler storage to appointment data.
schudlerControl1.Storage.AppointmentStorage.DataSource = dataSet.CarScheduling;
// Load data into the 'CarsDBDataSet.CarScheduling' table.
adapter.Fill(dataSet.CarScheduling);
schudlerControl1.Storage.AppointmentsInserted +=
new PersistentObjectsEventHandler(Storage_AppointmentsModified);
schudlerControl1.Storage.AppointmentsChanged +=
new PersistentObjectsEventHandler(Storage_AppointmentsModified);
schudlerControl1.Storage.AppointmentsDeleted +=
new PersistentObjectsEventHandler(Storage_AppointmentsModified);
adapter.Adapter.RowUpdated +=
new System.Data.OleDb.OleDbRowUpdatedEventHandler(adapter_RowUpdated);
}
void Storage_AppointmentsModified(object sender, PersistentObjectsEventArgs e)
{
adapter.Adapter.Update(dataSet);
this.dataSet.AcceptChanges();
}
private void adapter_RowUpdated(object sender, System.Data.OleDb.OleDbRowUpdatedEventArgs e)
{
if (e.Status == UpdateStatus.Continue && e.StatementType == StatementType.Insert)
{
int id = 0;
using (OleDbCommand cmd = new OleDbCommand("SELECT @@IDENTITY", adapter.Connection))
{
id = (int)cmd.ExecuteScalar();
}
e.Row["ID"] = id;
}
}
}
我收到的错误来自void Storage_appointsmodified中的adapter一词,该词表示当前上下文中不存在名称“adapter”。我知道我必须定义适配器,但如何定义?我是C新手,所以写C语法不流利 您已经在intSchedular方法中定义了适配器变量。但该变量是该方法的局部变量,不能在其外部使用。退出intSchedular时,该变量将被销毁 为了能够在修改后的Storage_Appointments中使用变量,您需要在全局类作用域中定义它,就像您对CarsDBDataSet所做的那样 代码中要解决的另一个问题是连接的处理。应按照精确的模式使用连接。创建、打开、使用、关闭和销毁。您应该在intSchedular中使用using语句,以确保连接被破坏
private void intSchedular()
{
// CREATE
using(OleDbConnection con = new OleDbConnection(... con string here....))
using(OleDbCommand createCommand = new OleDbCommand("select * from CarScheduling", con))
{
// OPEN
con.Open();
// NO USING HERE BECAUSE WE WANT THE ADAPTER OUTSIDE OF THIS METHOD
adapter = new OleDbDataAdapter(createCommand);
// USE
....
adapter.Fill(dataSet.CarScheduling);
....
} // CLOSE + DISPOSE
}
同样的事情也应该在适配器中进行
您已经在intSchedular方法中定义了适配器变量。但该变量是该方法的局部变量,不能在其外部使用。退出intSchedular时,该变量将被销毁 为了能够在修改后的Storage_Appointments中使用变量,您需要在全局类作用域中定义它,就像您对CarsDBDataSet所做的那样 代码中要解决的另一个问题是连接的处理。应按照精确的模式使用连接。创建、打开、使用、关闭和销毁。您应该在intSchedular中使用using语句,以确保连接被破坏
private void intSchedular()
{
// CREATE
using(OleDbConnection con = new OleDbConnection(... con string here....))
using(OleDbCommand createCommand = new OleDbCommand("select * from CarScheduling", con))
{
// OPEN
con.Open();
// NO USING HERE BECAUSE WE WANT THE ADAPTER OUTSIDE OF THIS METHOD
adapter = new OleDbDataAdapter(createCommand);
// USE
....
adapter.Fill(dataSet.CarScheduling);
....
} // CLOSE + DISPOSE
}
同样的事情也应该在适配器中进行
但在您输入代码this.adapter.UpdatedataSet时修改的存储指定中,您删除了private void intSchedular中的适配器。在intSchedular中,我已删除适配器声明,因为它已在全局级别声明。因此,intSchedular内部的新声明将混淆外部全局声明。相反,我希望全局的一个由新的OleDbDataAdapter初始化…哦,我现在明白了!我明白,但这会给我带来另一个问题。在私有的void适配器中,我更新了上一个void,在单词Connection上出现了另一个错误,错误为:error 1'System.Data.OleDb.OleDbDataAdapter'不包含'Connection'的定义,并且找不到接受'System.Data.OleDb.OleDbDataAdapter'类型的第一个参数的扩展方法'Connection'指令或程序集引用?C:\Users。。。我说的这行代码使用的是OleDbCommand cmd=new OleDbCommandSELECT@@IDENTITY,adapter.connection您可以从adapter.SelectCommand.connection获取连接。但最好的方法是重新建立连接。还请注意,应关闭并释放连接。我会在回答中补充一些关于这一点的问题,我想我明白了!顺便说一句,谢谢。在无效的存储指定修改对象发送器中,PersistentObjectsEventArgs e您更改了this.adapter.adapter.UpdatedataSet;到this.adapter.UpdatedataSet;当我运行程序并添加约会时,调试程序会高亮显示此代码this.adapter.UpdatedataSet;并告诉我对象引用不再设置为对象的实例!谢谢老师教我!但在您输入代码this.adapter.UpdatedataSet时修改的存储指定中,您删除了private void intSchedular中的适配器。在intSchedular中,我已删除适配器声明,因为它已在全局级别声明。因此,intSchedular内部的新声明将混淆外部全局声明。相反,我希望全局的一个由新的OleDbDataAdapter初始化…哦,我现在明白了!我明白,但这会给我带来另一个问题。在私有的void适配器中,我更新了上一个void,在单词Connection上出现了另一个错误,错误为:error 1'System.Data.OleDb.OleDbDataAdapter'不包含'Connection'的定义,并且找不到接受'System.Data.OleDb.OleDbDataAdapter'类型的第一个参数的扩展方法'Connection'指令或程序集引用?C:\Users。。。我说的这行代码使用的是OleDbCommand cmd=new OleDbCommandSELECT@@IDENTITY,adapter.connection您可以从adapter.SelectCommand.connection获取连接。但最好的方法是重新建立连接。还请注意,应关闭并释放连接。我要加些东西
在关于这个问题的回答中,还有一个问题,我想我明白了!顺便说一句,谢谢。在无效的存储指定修改对象发送器中,PersistentObjectsEventArgs e您更改了this.adapter.adapter.UpdatedataSet;到this.adapter.UpdatedataSet;当我运行程序并添加约会时,调试程序会高亮显示此代码this.adapter.UpdatedataSet;并告诉我对象引用不再设置为对象的实例!谢谢老师教我!
private void adapter_RowUpdated(object sender, System.Data.OleDb.OleDbRowUpdatedEventArgs e)
{
if (e.Status == UpdateStatus.Continue && e.StatementType == StatementType.Insert)
{
int id = 0;
using (OleDbConnection con = new OleDbConnection( .... con string here ....))
using (OleDbCommand cmd = new OleDbCommand("SELECT @@IDENTITY", con))
{
con.Open();
id = (int)cmd.ExecuteScalar();
}
e.Row["ID"] = id;
}
}