C# 使用Devexpress编辑远程MS Access数据库

C# 使用Devexpress编辑远程MS Access数据库,c#,database,devexpress,C#,Database,Devexpress,我做错了什么?我试图显示远程数据库中的数据,并插入、编辑和删除数据。我正在连接的数据库是一个远程数据库,我成功地连接并查看了该数据库的信息。但是,当我插入语法来编辑数据时,我发现一个错误,请参阅本文底部。 我正在使用Devexpress调度器控制器查看约会以及编辑约会。 这是全部代码 public partial class MainWindow : Window { CarsDBDataSet dataSet; public MainWindow() {

我做错了什么?我试图显示远程数据库中的数据,并插入、编辑和删除数据。我正在连接的数据库是一个远程数据库,我成功地连接并查看了该数据库的信息。但是,当我插入语法来编辑数据时,我发现一个错误,请参阅本文底部。 我正在使用Devexpress调度器控制器查看约会以及编辑约会。 这是全部代码

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