C# 如何正确处理数据库和连接

C# 如何正确处理数据库和连接,c#,wpf,ms-access,visual-studio-2013,data-binding,C#,Wpf,Ms Access,Visual Studio 2013,Data Binding,在我的C应用程序中,我有一个目录列表,我希望用户能够在网格上显示和更新这些目录 为了实现这一点,我显示了网格并设置了Update命令,因此每当用户更改网格中的某些内容时,MsAccess数据库都会更新 每当按下某物目录按钮时,UpdateGrid函数就会运行。此函数接收表名和更新查询,以及进行更新的参数列表 private void UpdateGrid(string data, string queryUpdate, List<Tuple<string, OleDbType,int

在我的C应用程序中,我有一个目录列表,我希望用户能够在网格上显示和更新这些目录

为了实现这一点,我显示了网格并设置了Update命令,因此每当用户更改网格中的某些内容时,MsAccess数据库都会更新

每当按下某物目录按钮时,UpdateGrid函数就会运行。此函数接收表名和更新查询,以及进行更新的参数列表

private void UpdateGrid(string data, string queryUpdate, List<Tuple<string, OleDbType,int>> parameters, bool Fuse, string description)
{

    tblName.Text = description;

    try
    {
        OleDbConnection conn = (Fuse ? new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Fusing.mdb") : new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=MaterialDB.mdb"));

        OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + data, conn);

        myDataSet = new DataSet();
        adapter.Fill(myDataSet, data);
        DataTable myDataTable = myDataSet.Tables[data];

        // Create the UpdateCommand.
        OleDbCommand command = new OleDbCommand(queryUpdate, conn);

        // Add the parameters for the UpdateCommand.
        foreach (var param in parameters)
        {
            command.Parameters.Add("@" + param.Item1, param.Item2, param.Item3, param.Item1);
        }
        command.Parameters.Add("@ID", OleDbType.Integer, 5, "ID");
        adapter.UpdateCommand = command;

        // Update the DB whenever a row changes
        myDataTable.RowChanged += (s, f) =>
        {
            adapter.Update(myDataTable);
        };
        var be = CatalogsGrid.GetBindingExpression(DataGrid.ItemsSourceProperty);

        CatalogsGrid.DataContext = myDataSet;
        CatalogsGrid.ItemsSource = myDataSet.Tables[0].DefaultView;
        Binding nbe = new Binding
        {
            Source = myDataSet,
            Mode = BindingMode.TwoWay,
            UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
            Path = new PropertyPath(data),
            BindsDirectlyToSource = true
        };
        CatalogsGrid.SetBinding(DataGrid.ItemsSourceProperty, nbe);

        CatalogsGrid.Items.Refresh();
    }
    catch (Exception)
    {
        return;
    }
}
然后更新停止工作,并出现一个一般性错误,告诉您更新查询是错误的

我应该使用每个连接、数据适配器和命令,还是让它们在C决定时消亡

编辑:

下面是使用的代码:

private void UpdateGrid(string data, string queryUpdate, List<Tuple<string, OleDbType,int>> parameters, bool Fuse, string description)
{

    tblName.Text = description;

    try

    {
        using (OleDbConnection conn = (Fuse ? new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Fusing.mdb") : new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=MaterialDB.mdb")))
        {
            using (OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + data, conn))
            {

                myDataSet = new DataSet();
                adapter.Fill(myDataSet, data);
                DataTable myDataTable = myDataSet.Tables[data];

                // Create the UpdateCommand.
                using (OleDbCommand command = new OleDbCommand(queryUpdate, conn))
                {

                    // Add the parameters for the UpdateCommand.
                    foreach (var param in parameters)
                    {
                        command.Parameters.Add("@" + param.Item1, param.Item2, param.Item3, param.Item1);
                    }
                    command.Parameters.Add("@ID", OleDbType.Integer, 5, "ID");
                    adapter.UpdateCommand = command;

                    // Update the DB whenever a row changes
                    myDataTable.RowChanged += (s, f) =>
                    {
                        adapter.Update(myDataTable);
                    };
                    var be = CatalogsGrid.GetBindingExpression(DataGrid.ItemsSourceProperty);

                    CatalogsGrid.DataContext = myDataSet;
                    CatalogsGrid.ItemsSource = myDataSet.Tables[0].DefaultView;
                    Binding nbe = new Binding
                    {
                        Source = myDataSet,
                        Mode = BindingMode.TwoWay,
                        UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
                        Path = new PropertyPath(data),
                        BindsDirectlyToSource = true
                    };
                    CatalogsGrid.SetBinding(DataGrid.ItemsSourceProperty, nbe);

                    CatalogsGrid.Items.Refresh();
                }
            }
        }

    }
    catch (Exception)
    {
        return;
    }
}
当运行此代码时,我得到以下异常


我在互联网上的搜索表明,这是数据库更新过程中发生的任何错误的一般错误,99%的时间不是查询中的错误,我们知道情况并非如此,因为在我们放置using语句之前,一切正常。

始终使用积木作为一次性用品。请看。另外,你的空捕获是非常糟糕的做法,你吞下了异常,什么也不做。如果你把它留在家里,你将不知道为什么某些东西会停止工作。记录异常并恢复或根本不捕获完全删除try/catch。您应该使用实现的所有内容。@MichaelGunter-这是指向OLEDB连接的链接和代码。但它似乎仍然有效,因为它是从DataAdapter继承的,DataAdapter是从实现IDisposable的组件继承的。@MichaelGunter噢,该死的。谢谢,我没有在组件上看到它。这将教会我在睡觉前评论;然后更新停止工作,并出现一个一般性错误,告诉您更新查询是错误的。
private void UpdateGrid(string data, string queryUpdate, List<Tuple<string, OleDbType,int>> parameters, bool Fuse, string description)
{

    tblName.Text = description;

    try

    {
        using (OleDbConnection conn = (Fuse ? new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Fusing.mdb") : new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=MaterialDB.mdb")))
        {
            using (OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + data, conn))
            {

                myDataSet = new DataSet();
                adapter.Fill(myDataSet, data);
                DataTable myDataTable = myDataSet.Tables[data];

                // Create the UpdateCommand.
                using (OleDbCommand command = new OleDbCommand(queryUpdate, conn))
                {

                    // Add the parameters for the UpdateCommand.
                    foreach (var param in parameters)
                    {
                        command.Parameters.Add("@" + param.Item1, param.Item2, param.Item3, param.Item1);
                    }
                    command.Parameters.Add("@ID", OleDbType.Integer, 5, "ID");
                    adapter.UpdateCommand = command;

                    // Update the DB whenever a row changes
                    myDataTable.RowChanged += (s, f) =>
                    {
                        adapter.Update(myDataTable);
                    };
                    var be = CatalogsGrid.GetBindingExpression(DataGrid.ItemsSourceProperty);

                    CatalogsGrid.DataContext = myDataSet;
                    CatalogsGrid.ItemsSource = myDataSet.Tables[0].DefaultView;
                    Binding nbe = new Binding
                    {
                        Source = myDataSet,
                        Mode = BindingMode.TwoWay,
                        UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
                        Path = new PropertyPath(data),
                        BindsDirectlyToSource = true
                    };
                    CatalogsGrid.SetBinding(DataGrid.ItemsSourceProperty, nbe);

                    CatalogsGrid.Items.Refresh();
                }
            }
        }

    }
    catch (Exception)
    {
        return;
    }
}