C#问题:对我来说,加载.MDB文件,进行更改并将更改保存回原始文件的最简单方法是什么? - c#

我正在从事的项目即将完成。我正在加载.MDB文件,在DataGrid上显示内容,并尝试在DataGrid上获取这些更改,然后将其保存回.MDB文件。我还将创建一个函数,使我可以从一个.MDB文件中获取表并将其保存到另一个.MDB文件中。当然,如果我不知道如何将更改保存回.MDB文件,则无法执行任何操作。

我已经对Google进行了广泛的研究,但我的问题没有答案。我认为自己是该特定主题的初学者,所以请不要使答案太复杂-我需要最简单的方法来编辑.MDB文件!请提供编程示例。

假设我已经建立了到DataGrid的连接。如何获得Datagrid所做的更改?我确定这一回答足够简单。
然后,我需要知道如何使用此数据表,将其插入来自它的数据集,然后采用该数据集并重写.MDB文件。 (如果有一种方法只能插入已更改的表,则我更愿意这样做。)

预先谢谢您,如果您需要更多信息,请告诉我。这是我可能要问的最后一件事……谢谢上帝。

编辑:

我正在使用的.mdb是Microsoft Access数据库。 (我什至不知道有多个.mdb文件)

我知道我无法通过流写入器或任何其他方法直接写入.MDB文件,但是有没有办法我可以生成其中已包含DataSet信息的.MDB文件?还是只有一种方法可以将表添加到已经加载到DataGrid的.MDB文件中。有办法!

同样,我需要一种在C#中以编程方式执行此操作的方法。

编辑:

好的,我的项目很大,但是我使用一个单独的类文件来处理所有数据库连接。我知道我的设计和来源确实很草率,但是可以完成工作。我只和我在互联网上找到的例子一样好。

记住,我只是以另一种形式连接到DataGrid。让我知道您是否需要Datagrid表单中的代码(但我不知道您为什么需要它)。 DatabaseHandling.cs处理2个.MDB文件。因此,您将在其中看到两个数据集。我将最终使用它从一个数据集中获取表并将其放入另一个数据集中。我只需要弄清楚如何将这些值BACK保存回.MDB文件。

反正有这样做吗?一定有办法...

编辑:

从我的研究和阅读中...我认为答案就在我的鼻子底下。使用“ Update()”命令。现在,尽管这可以确保实际上有一种简单的方法可以执行此操作,但我仍然面临这样的问题:我不懂如何使用此更新命令。

也许我可以这样设置:

Oledb.OledbConnection cn = new Oledb.OledbConnection(); 
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Staff.mdb"; 
Oledb.OledbCommand cmd = new Oledb.OledbCommand(cn); 
cmd.CommandText = "INSERT INTO Customers (FirstName, LastName) VALUES (@FirstName, @LastName)"; 

我认为可以这样做,但我不想手动插入任何内容。我想同时做这两个:

获取在Datagrid上更改的信息,并更新我从中获取的Access数据库文件(.mdb)
创建一个函数,使我可以从另一个Access数据库文件(.mdb)中获取表并将其替换为辅助Access数据库文件(.mdb)。这两个文件将使用完全相同的结构,但其中将包含不同的信息。

我希望有人为此提供答案...我的项目已经完成,等待的只是一个简单的答案。

再次感谢您。

编辑:

好...好消息。我想出了如何查询.mdb文件本身(我认为)。这是代码,由于我尝试使用sql命令而导致运行时错误,因此无法使用。这将带我下一个问题。

添加到DatabaseHandling.cs的新功能代码:

static public void performSynchronization(string table, string tableTwoLocation)
{
    OleDbCommand cmdCopyTables = new OleDbCommand("INSERT INTO" + table + "SELECT * FROM [MS Access;" + tableTwoLocation + ";].[" + table + "]"); // This query generates runtime error
    cmdCopyTables.Connection = dataconnectionA;
    dataconnectionA.Open();
    cmdCopyTables.ExecuteNonQuery();
    dataconnectionA.Close();
}

如您所见,我实际上已经设法对连接本身执行了查询,我相信这是实际的Access .MDB文件。正如我所说,我在文件上执行的SQL查询无法正常工作,并且在使用时会产生运行时错误。

我尝试执行的命令应该从.MDB文件中获取一个表,然后覆盖另一个.MDB文件中相同类型的表。我在上面尝试的SQL命令试图直接从.mdb文件中获取表,然后将其直接放在另一个文件中-这不是我想要的。我想从.MDB文件中获取所有信息-将表放入数据表中,然后将所有数据表添加到数据集中(我已完成。)我想对两个.MDB文件执行此操作。一旦有了两个数据集,我想从每个数据集中取出特定的表,然后将它们添加到每个文件中,如下所示:

DataSetA >>>> ----- [添加表
(覆盖它们)] ----- >>>> DataSetB
DataSetB >>>> ----- [添加表
(覆盖它们)] ----- >>>> DataSetA

我想将这些数据集分别作为数据集,然后将它们放回它们来自的每个Access .MDB文件中。本质上保持两个数据库同步。

因此,我提出的问题是:

如何创建一个SQL查询,该查询将通过覆盖现有的相同名称的表将表添加到.MDB文件。该查询应该能够在运行时动态创建,并使用一个数组替换为我要添加的表名的变量。
如何获取Datagrid对DataTable所做的更改并将其放回DataTable(或DataSet)中,以便将其发送到.MDB文件?

我已尽力详细阐述...因为我认为我对问题的解释不是很好。现在这个问题已经太久了。我只是希望我能更好地解释这一点。 :[

编辑:

感谢下面的用户,我想我几乎找到了解决方法-关键字差不多。
这是下面我更新的DatabaseHandling.cs代码。我收到运行时错误“数据类型不匹配”。考虑到我试图将这些表复制到具有完全相同设置的另一个数据库中,我不知道这怎么可能。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;
using System.IO;

    namespace LCR_ShepherdStaffupdater_1._0
    {
        public class DatabaseHandling
        {
            static DataTable datatableB = new DataTable();
            static DataTable datatableA = new DataTable();
            public static DataSet datasetA = new DataSet();
            public static DataSet datasetB = new DataSet();
            static OleDbDataAdapter adapterA = new OleDbDataAdapter();
            static OleDbDataAdapter adapterB = new OleDbDataAdapter();
            static string connectionstringA = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Settings.getfilelocationA();
            static string connectionstringB = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Settings.getfilelocationB();
            static OleDbConnection dataconnectionB = new OleDbConnection(connectionstringB);
            static OleDbConnection dataconnectionA = new OleDbConnection(connectionstringA);
            static DataTable tableListA;
            static DataTable tableListB;

            static public void addTableA(string table, bool addtoDataSet)
            {
                dataconnectionA.Open();
                datatableA = new DataTable(table);
                try
                {
                    OleDbCommand commandselectA = new OleDbCommand("SELECT * FROM [" + table + "]", dataconnectionA);
                    adapterA.SelectCommand = commandselectA;
                    adapterA.Fill(datatableA);
                }
                catch
                {
                    Logging.updateLog("Error: Tried to get " + table + " from DataSetA. Table doesn't exist!");
                }

                if (addtoDataSet == true)
                {
                    datasetA.Tables.Add(datatableA);
                    Logging.updateLog("Added DataTableA: " + datatableA.TableName.ToString() + " Successfully!");
                }

                dataconnectionA.Close();
            }

            static public void addTableB(string table, bool addtoDataSet)
            {
                dataconnectionB.Open();
                datatableB = new DataTable(table);

                try
                {
                    OleDbCommand commandselectB = new OleDbCommand("SELECT * FROM [" + table + "]", dataconnectionB);
                    adapterB.SelectCommand = commandselectB;
                    adapterB.Fill(datatableB);
                }
                catch
                {
                    Logging.updateLog("Error: Tried to get " + table + " from DataSetB. Table doesn't exist!");
                }



                if (addtoDataSet == true)
                {
                    datasetB.Tables.Add(datatableB);
                    Logging.updateLog("Added DataTableB: " + datatableB.TableName.ToString() + " Successfully!");
                }

                dataconnectionB.Close();
            }

            static public string[] getTablesA(string connectionString)
            {
                dataconnectionA.Open();
                tableListA = dataconnectionA.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });
                string[] stringTableListA = new string[tableListA.Rows.Count];

                for (int i = 0; i < tableListA.Rows.Count; i++)
                {
                    stringTableListA[i] = tableListA.Rows[i].ItemArray[2].ToString();
                }
                dataconnectionA.Close();
                return stringTableListA;
            }

            static public string[] getTablesB(string connectionString)
            {
                dataconnectionB.Open();
                tableListB = dataconnectionB.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });
                string[] stringTableListB = new string[tableListB.Rows.Count];

                for (int i = 0; i < tableListB.Rows.Count; i++)
                {
                    stringTableListB[i] = tableListB.Rows[i].ItemArray[2].ToString();
                }
                dataconnectionB.Close();
                return stringTableListB;
            }

            static public void createDataSet()
            {

                string[] tempA = getTablesA(connectionstringA);
                string[] tempB = getTablesB(connectionstringB);
                int percentage = 0;
                int maximum = (tempA.Length + tempB.Length);

                Logging.updateNotice("Loading Tables...");
                for (int i = 0; i < tempA.Length ; i++)
                {
                    if (!datasetA.Tables.Contains(tempA[i]))
                    {
                        addTableA(tempA[i], true);
                        percentage++;
                        Logging.loadStatus(percentage, maximum);
                    }
                    else
                    {
                        datasetA.Tables.Remove(tempA[i]);
                        addTableA(tempA[i], true);
                        percentage++;
                        Logging.loadStatus(percentage, maximum);
                    }
                }

                for (int i = 0; i < tempB.Length ; i++)
                {
                    if (!datasetB.Tables.Contains(tempB[i]))
                    {
                        addTableB(tempB[i], true);
                        percentage++;
                        Logging.loadStatus(percentage, maximum);
                    }
                    else
                    {
                        datasetB.Tables.Remove(tempB[i]);
                        addTableB(tempB[i], true);
                        percentage++;
                        Logging.loadStatus(percentage, maximum);
                    }
                }


            }

            static public DataTable getDataTableA()
            {
                datatableA = datasetA.Tables[Settings.textA];

                return datatableA;
            }
            static public DataTable getDataTableB()
            {
                datatableB = datasetB.Tables[Settings.textB];
                return datatableB;
            }

            static public DataSet getDataSetA()
            {
                return datasetA;
            }

            static public DataSet getDataSetB()
            {
                return datasetB;
            }

            static public void InitiateCopyProcessA()
            {
                DataSet tablesA;
                tablesA = DatabaseHandling.getDataSetA();

                foreach (DataTable table in tablesA.Tables)
                {
                    CopyTable(table, connectionstringB);
                }
            }

            public static void CopyTable(DataTable table, string connectionStringB)
            {
                var connectionB = new OleDbConnection(connectionStringB);
                foreach (DataRow row in table.Rows)
                {
                    InsertRow(row, table.Columns, table.TableName, connectionB);
                }
            }

            public static void InsertRow(DataRow row, DataColumnCollection columns, string table, OleDbConnection connection)
            {
                var columnNames = new List<string>();
                var values = new List<string>();

                for (int i = 0; i < columns.Count; i++)
                {
                    columnNames.Add("[" + columns[i].ColumnName + "]");
                    values.Add("'" + row[i].ToString().Replace("'", "''") + "'");
                }

                string sql = string.Format("INSERT INTO {0} ({1}) VALUES ({2})",
                        table,
                        string.Join(", ", columnNames.ToArray()),
                        string.Join(", ", values.ToArray())
                    );

                ExecuteNonQuery(sql, connection);
            }

            public static void ExecuteNonQuery(string sql, OleDbConnection conn)
            {
                if (conn == null)
                    throw new ArgumentNullException("conn");

                ConnectionState prevState = ConnectionState.Closed;
                var command = new OleDbCommand(sql, conn);
                try
                {
                    prevState = conn.State;
                    if (prevState != ConnectionState.Open)
                        conn.Open();

                    command.ExecuteNonQuery(); // !!! Runtime-Error: Data type mismatch in criteria expression. !!!
                }
                finally
                {
                    if (conn.State != ConnectionState.Closed
                        && prevState != ConnectionState.Open)
                        conn.Close();
                }
            }

            }          
        }

为什么会出现此错误?这两个表完全相同。我究竟做错了什么?
最坏的情况是,如何在插入另一个具有相同值的完全相同的结构表之前删除另一个Access .MDB文件中的表?

老兄,我希望我能弄清楚这一点...

编辑:

好吧,我走了一段距离。我的问题演变成一个新的问题,因此值得单独提出。我已经回答了我的问题,因为现在我知道如何直接对打开的连接执行查询。谢谢你们!

参考方案

我不确定您走了多远,但是如果您想进行快速的拖放操作,则可能需要查看创建一个连接的强类型数据集,并使用DataSources Tool Window的拖放功能。在Visual Studio中。

肯定有样本,但是您会想要的。

创建一个新的数据集
在服务器资源管理器中从数据连接树中拖放
创建一个新表格
从数据源工具中拖动表
窗体上的窗口。

更新:

首先,我不是100%理解您的问题。如果可以在访问文件之间创建一些最佳的LinkTable,则可以使用sql语句(例如“ INSERT INTO客户SELECT FirstName,LastName FROM File2.Customers”)在文件之间复制数据。如果不是那样,那么我认为您将不得不循环数据表并使用与上次编辑类似的INSERT语句手动插入记录。至于数据网格,您可能必须通过监视RowChanged事件(不确定确切的事件)来跟踪更改的内容,甚至在行更改时也执行插入/更新语句。

更新:

循环数据表,您将执行以下操作。未经测试。我刚刚再次对其进行了更新,以包括MakeValueDbReady函数。这也没有经过测试,我不确定我是否已经正确处理了所有案例甚至所有案例。您实际上必须调试sql语句,并确保其生成正确的值。每个数据库处理的值都是不同的。至少可以这样提取值解析。我还意识到,不必对TableName进行硬编码,您应该能够从DataTable的属性中获取它

void CopyTable(DataTable table, string connectionStringB)
{
    var connectionB = new OleDbConnection(connectionStringB);
    foreach(DataRow row in table.Rows)
    {
        InsertRow(row, table.Columns, table.TableName, connectionB);
    }
}

public static void InsertRow(DataRow row, DataColumnCollection columns, string table, OleDbConnection connection)
{
    var columnNames = new List<string>();
    var values = new List<string>();

    // generate the column and value names from the datacolumns    
    for(int i =0;i<columns.Count; i++)
    {
        columnNames.Add("[" + columns[i].ColumnName + "]");
        // datatype mismatch should be fixed by this function
        values.Add(MakeValueDbReady(row[i], columns[i].DataType));
    }

    // create the sql
    string sql = string.Format("INSERT INTO {0} ({1}) VALUES ({2})",
            table,
            string.Join(", ", columnNames.ToArray()),
            string.Join(", ", values.ToArray())
        );

    // debug the accuracy of the sql here and even copy into 
    // a new Query in Access to test
    ExecuteNonQuery(sql, connection);
}

// as the name says we are going to check the datatype and format the value
// in the sql string based on the type that the database is expecting
public string MakeValueDbReady(object value, Type dataType)
{
    if (value == null)
        return null;

    if (dataType == typeof(string))
    {
        return "'" + value.ToString().Replace("'", "''") + "'"
    }
    else if (dataType == typeof(DateTime))
    {
        return "#" + ((DateTime)value).ToString + "#"
    }
    else if (dataType == typeof(bool))
    {
        return ((bool)value) ? "1" : "0";
    }

    return value.ToString();
}

public static void ExecuteNonQuery(string sql, OleDbConnection conn)
{
    if (conn == null)
        throw new ArgumentNullException("conn");

    ConnectionState prevState = ConnectionState.Closed;
    var command = new OleDbCommand(sql, conn);
    try
    {
        // the reason we are checking the prev state is for performance reasons
        // later you might want to open the connection once for the a batch
        // of say 500 rows  or even wrap your connection in a transaction.
        // we don't want to open and close 500 connections
        prevState = conn.State;
        if (prevState != ConnectionState.Open)
            conn.Open();

        command.ExecuteNonQuery();
    }
    finally
    {
        if (conn.State != ConnectionState.Closed
            && prevState != ConnectionState.Open)
            conn.Close();
    }
}

如何从php中获取datatables jQuery插件的json数据 - php

我是PHP的新手,正在尝试使用Datatables jQuery插件。我知道我必须从.php文件中获取数据,然后在数据表中使用它,但是我似乎无法通过ajax将其传递给数据表。我设法从数据库中获取数据,并对其进行json编码,但是后来我不知道如何在我的index.php文件中调用它,并在其中显示它。我究竟做错了什么?这是我的代码:HTML(已编辑): <…

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

改造正在返回一个空的响应主体 - java

我正在尝试使用Retrofit和Gson解析一些JSON。但是,我得到的响应机构是空的。当我尝试从对象中打印信息时,出现NullPointerException。我确保URL正确,并且我也确保POJO也正确。我正在使用jsonschema2pojo来帮助创建POJO类。这是我要解析的JSON{ "?xml": { "@versi…

jQuery发布不会将数据发布到ASP.NET API控制器 - javascript

我有一次噩梦般的时间通过jquery post将数据发送到ASP.NET Controller。这是JSON.stringify之后的数据:[{"scheduleTaskID":"203","task":"Permit","baselineDate":…

在Android Studio中设计可滚动内容时应遵循的方法是什么? - java

我正在约束布局中设计我的应用程序,并将其放置在“滚动视图”下。我想放置更多的Card Views,但是在xml文件的预览中没有放置空间。当布局已满时,我应该在哪里拖放Buttons,TextViews等?我已经处理了文本的滚动视图,但这是另外一回事。我知道我只能输入代码,但是当内容超出定义的屏幕尺寸时,我将无法看到我正在设计的内容时,我将很难这样做。(如果您…