如何使用 c# 将数据表值添加到 ms 访问表

Posted

技术标签:

【中文标题】如何使用 c# 将数据表值添加到 ms 访问表【英文标题】:how to add data table values to a ms access table using c# 【发布时间】:2016-09-15 06:35:11 【问题描述】:

我在 SQL Server 中有 10 个表,我想将这些表值导出到一个也包含 10 个表的 ms access 数据库。那么有什么方法可以使用 c# 代码导出数据。 我不想为每个表编写大量代码以从特定表中获取数据然后逐行插入到相应的访问表中是否有任何可用的快捷方式我可以使用请告诉我。

【问题讨论】:

你没有提到你到目前为止所尝试的任何事情。 您似乎也没有在 Internet 上进行任何搜索。这个问题一直是answered on SO before。 【参考方案1】:

我认为这段代码对你有帮助。

OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"Database.accdb\";Persist Security Info=False;");

                    //command to insert each ASIN
                    OleDbCommand cmd = new OleDbCommand();

                    //command to update each column (ASIN, Retail... from CSV)
                    OleDbCommand cmd1 = new OleDbCommand();

                    //load csv data to dtCSV datatabe
                    DataTable dtCSV = new DataTable();

                    dtCSV = ds.Tables[0];

                    // Now we will collect data from data table and insert it into database one by one
                    // Initially there will be no data in database so we will insert data in first two columns
                    // and after that we will update data in same row for remaining columns
                    // The logic is simple. 'i' represents rows while 'j' represents columns

                    cmd.Connection = myConnection;
                    cmd.CommandType = CommandType.Text;
                    cmd1.Connection = myConnection;
                    cmd1.CommandType = CommandType.Text;

                    myConnection.Open();

                    for (int i = 0; i <= dtCSV.Rows.Count - 1; i++)
                    
                        cmd.CommandText = "INSERT INTO " + lblTable.Text + "(ID, " + dtCSV.Columns[0].ColumnName.Trim() + ") VALUES (" + (i + 1) + ",'" + dtCSV.Rows[i].ItemArray.GetValue(0) + "')";

                        cmd.ExecuteNonQuery();

                        for (int j = 1; j <= dtCSV.Columns.Count - 1; j++)
                        
                            cmd1.CommandText = "UPDATE " + lblTable.Text + " SET [" + dtCSV.Columns[j].ColumnName.Trim() + "] = '" + dtCSV.Rows[i].ItemArray.GetValue(j) + "' WHERE ID = " + (i + 1);

                            cmd1.ExecuteNonQuery();
                        
                    

                    myConnection.Close();

【讨论】:

不,这对我没有帮助。我已将所有表存储到数据集中。现在我希望将这些表值插入到 ms 访问的相应表中。我不想逐行插入我只想将整个表值转储到 ms 访问表值中。 @JeetDaloneboy:DataSet 不能这样工作。 DataSet 通常是强类型的。即使它们不是您的情况,它们也需要每个表的 CRUD 命令(再次在行级别工作)来执行 DDL。至少您需要在每对对应的 SQL Server 和 Access 表之间建立一个转换函数。 我不能将数据表值转储到访问表吗?【参考方案2】:

如果这是一次性操作,您应该使用 SQL Server 的数据导出功能或 Access 的导入功能来执行此操作。对于不想编写代码的最终用户来说,它们足够简单。您只需在其中选择数据库、要导出的表和目标数据库,单击按钮即可导出所有内容。

【讨论】:

但我希望我的自定义表和列名在 ms 访问中。 在 Access 中获得数据后,您可以在其中重命名。 我只是按照要求不能这样做。【参考方案3】:

首先确保访问表列具有相同的列名和相似的类型。然后你就可以使用这个我认为非常快速和优雅的功能了。

    public void AccessBulkCopy(DataTable table)
    
        foreach (DataRow r in table.Rows)
            r.SetAdded();

var myAdapter = new OleDbDataAdapter("SELECT * FROM " + table.TableName, _myAccessConn);

        var cbr = new OleDbCommandBuilder(myAdapter);
        cbr.QuotePrefix = "[";
        cbr.QuoteSuffix = "]";
        cbr.GetInsertCommand(true);

        myAdapter.Update(table);
    

使用此代码

【讨论】:

问题是访问表名和列名与sql表和列名不同。 :(【参考方案4】:

嗯,我得到了答案。我使用 for 循环生成如下查询字符串。

    public void MainAccess(int _i)
    
        DataTable dt = ds.Tables[_i];
        string sql = "";

        for (int i = 0; i < dt.Rows.Count; i++)
        
        sql = sql + "INSERT INTO "+ _tableString[_i] + " values('";
        for (int j = 0; j < dt.Columns.Count; j++)
        
            sql += dt.Rows[i][j].ToString().Trim();
            if (j != dt.Columns.Count - 1)
            
                sql += "','";
            
            else
            
                sql += "')";
            
        
        ExecuteQuery(sql);
        sql = null;
    

【讨论】:

以上是关于如何使用 c# 将数据表值添加到 ms 访问表的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有图例键的数据表添加到 C# 中的 MS 图表?

如果不在列表中,则 MS 访问将项目添加到组合框

如何在 MS Access 中使用 C# 获取所有表名和列名?

如何使用 C# 仅将日期(不包括时间)插入 ms 访问数据库

如何使用 C# 以编程方式复制 MS SQL 2000 数据库?

如何将三个表数据复制到一个访问c#