我有一个问题是从数据表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;
}
}
答案 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相对安全。尽管如此,我强烈建议您(为了您和其他所有人的安全)养成编写没有这种潜在弱点的代码的习惯。