如何将Access数据表中的数据添加到具有不同列的另一个访问空数据表

时间:2017-08-01 13:40:45

标签: c# ms-access datatable

我有一个问题是从数据表1中获取数据到具有不同列名的空数据表2。

datatable 1

countrycode  country
0031         Netherlands
0032         Belgium

datatable 2

LandenID    Landnummer  Landnaam    ....
(empty)

结果应该是

datatable 2

LandenID    Landnummer  Landnaam    ....
1           0031        Netherlands
2           0032        Belgium

我在下面尝试过代码,但没有成功

    public void CopyImport2CT(string myTable)
    {
        //Copy data Importtable to Landentabel
        try
        {
            // Create the dataset and add the Categories table to it:
            DataSet myProviderDs = new DataSet();
            OleDbConnection mycopy2CTConn = null;
            try
            {
                mycopy2CTConn = new OleDbConnection(strProviderConn);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: Failed to create a database connection. \n{0}", ex.Message);
                throw ex;
            }
            string copystring = "select * from " + myTable;
            OleDbCommand myProviderCommand = new OleDbCommand(copystring, mycopy2CTConn);
            OleDbDataAdapter ca = new OleDbDataAdapter(myProviderCommand);
            DataSet ds1 = new DataSet();
            DataTable dt1 = new DataTable(myTable);
            dt1.Columns.Add("Countrycode");
            dt1.Columns.Add("Country");
            dt1.Columns.Add("Highfee");
            dt1.Columns.Add("Lowfee");
            dt1.Columns.Add("Weekendfee");
            ca.Fill(ds1);
            Console.WriteLine(ds1.Tables[0].Rows.Count);
            mycopy2CTConn.Open();
            DataSet ds2 = new DataSet();
            DataTable dt2 = new DataTable("Landentabel");
            dt2.Columns.Add("Landnummer");
            dt2.Columns.Add("Landnaam");
            dt2.Columns.Add("Piektarief");
            dt2.Columns.Add("Daltarief");
            dt2.Columns.Add("Weekendtarief");
            OleDbConnection myCTConn = null;
            try
            {
                myCTConn = new OleDbConnection(strProviderConn);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: Failed to create a database connection. \n{0}", ex.Message);
                throw ex;
            }


            for (int k = 0; k < ds1.Tables[0].Rows.Count; k++)
            {
                dt2.Rows.Add.[k]["Landnummer"] = ds2.Tables[0].Rows[k]["Countrycode"];
                dt2.Rows.Add.[k]["Landnaam"] = ds2.Tables[0].Rows[k]["Country"];
                dt2.Rows.Add.[k]["Piektarief"] = ds2.Tables[0].Rows[k]["Highfee"];
                dt2.Rows.Add.[k]["Daltarief"] = ds2.Tables[0].Rows[k]["Lowfee"];
                dt2.Rows.Add.[k]["Weekendtarief"] = ds2.Tables[0].Rows[k]["Weekendfee"];
            }

            mycopy2CTConn.Close();

        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: Failed to create a database connection. \n{0}", ex.Message);
            throw ex;
        }
    }

1 个答案:

答案 0 :(得分:1)

有一种更简单的方法可以做到这一点。

public void CopyImport2CT(string myTable)
{
    //Copy data Importtable to Landentabel
    try
    {
        using (OleDbConnection mycopy2CTConn = new OleDbConnection(strProviderConn))
        {
            string copystring = "INSERT INTO Landentabel (LandenID, Landnummer, Landnaam, Piektarief, Daltarief, Weekendtarief) SELECT (SELECT COUNT(*) FROM " + myTable + " WHERE e.CountryCode >= CountryCode) AS Id, e.CountryCode, e.Country, e.HighFee, e.LowFee, e.Weekendfee from " + myTable + " e ORDER BY e.CountryCode";
            using (OleDbCommand myProviderCommand = new OleDbCommand(copystring, mycopy2CTConn))
            {
                mycopy2CTConn.Open();
                myProviderCommand.ExecuteNonQuery();
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error: Failed to create a copy data. \n{0}", ex.Message);
        throw ex;
    }
}

这假设LandenID不是自动编号。如果它是一个自动编号,那么它变得更加容易。将copystring更改为:

string copystring = "INSERT INTO Landentabel (Landnummer, Landnaam, Piektarief, Daltarief, Weekendtarief) SELECT e.CountryCode, e.Country, e.HighFee, e.LowFee, e.Weekendfee from " + myTable + " e";

一些解释。

首先,DbConnection和DbCommand都实现了IDisposable。这意味着处理它们的推荐方法是在using()部分中,以便垃圾收集器立即知道何时可以安全地处理对象。对于您作为开发人员来说,重要的是,您不需要关心处置对象。

其次,一个SQL命令将所有条目插入到目标表中。这是一种更快的方法。一般语法是INSERT INTO ... SELECT ... FROM。 我的第一个例子假设LandenID是一个整数但不是一个自动编号。 AutoNumbers是我的宠儿,所以我提供了一些有用的语法来导出Access中的行号(Access没有内置的ROW_NUMBER函数,就像其他dbs一样,如SQL Server)。如果您使用的是AutoNumber,只需将其替换为copystring的第二个定义。

第三,我已经跟着你将源表的名称作为字符串参数传递。但是,除非你有充分的理由这样做,否则我鼓励你不要这样做。为什么?首先,您需要知道代码中myTable的列名。如果你知道列名,为什么你不知道表名?为什么这需要作为参数?其次,更重要的是以这种方式构建SQL查询,即创建一个字符串并在该字符串中插入一个字符串参数,这样就可以打开SQL注入。如果您不知道这是什么,我建议您使用谷歌。实际上由于技术原因,Access一次只接受一个命令,因此从最恶劣形式的SQL注入开始,Access相对安全。尽管如此,我强烈建议您(为了您和其他所有人的安全)养成编写没有这种潜在弱点的代码的习惯。