从我的访问数据库获取值到DataTable table
string accessconst = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:/Program Files (x86)/BALLBACH/Database/Messdaten.mdb";
DataTable table = new DataTable();
using (OleDbConnection conn = new OleDbConnection(accessconst))
{
using (OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM Messdaten", conn))
{
da.Fill(table);
}
}
从我的sql数据库中获取值到DataTable tablesql
string sqlconstr = "sqlconstr";
DataTable tablesql = new DataTable();
using (SqlConnection conn = new SqlConnection(sqlconstr))
{
using (SqlDataAdapter da = new SqlDataAdapter("SELECT p1 FROM UMP", conn))
{
da.Fill(tablesql);
}
}
现在,我想将值从访问数据库导入到sql数据库中,除了先前从访问数据库添加的记录。我该怎么办?
//HERE IS THE PROBLEM
using (SqlConnection con = new SqlConnection("MyConnectionStr "))
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandText = "INSERT INTO UMP VALUES (@p1, @p2, @p3)";
cmd.Connection = con;
cmd.Parameters.Add("@p1", SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@p2", SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@p3", SqlDbType.NVarChar, 50);
con.Open();
for (int i = 0; i < table.Rows.Count; i++)
{
cmd.Parameters["@p1"].Value = table.Rows[i][0];
cmd.Parameters["@p2"].Value = table.Rows[i][1];
cmd.Parameters["@p3"].Value = table.Rows[i][2];
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
break;
}
}
}
}
答案 0 :(得分:0)
我建议采取所有访问数据并将其插入到临时表中。
然后基于左联接插入数据,执行插入。
然后您的代码将如下所示……
//data from access
private void insertValues(DataTable table)
{
using (SqlConnection con = new SqlConnection("MyConnectionStr "))
{
using (SqlCommand cmd = con.CreateCommand())
{
createTable();
//note changed the insert to tmp table.
cmd.CommandText = "INSERT INTO UMP_TMP VALUES (@p1, @p2, @p3)";
cmd.Connection = con;
cmd.Parameters.Add("@p1", SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@p2", SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@p3", SqlDbType.NVarChar, 50);
con.Open();
for (int i = 0; i < table.Rows.Count; i++)
{
cmd.Parameters["@p1"].Value = table.Rows[i][0];
cmd.Parameters["@p2"].Value = table.Rows[i][1];
cmd.Parameters["@p3"].Value = table.Rows[i][2];
try
{
cmd.ExecuteNonQuery();
}
catch (Exception)
{
break;
}
}
//merge the data from within sql server
mergeTable();
//drop the temporary table
dropTable();
}
}
}
private void createTable(){
issueStatement("create table UMP_TMP(p1 varchar(50), p2 varchar(50), p3 varchar(50));");
}
private void dropTable()
{
issueStatement("drop table UMP_TMP;");
}
private void mergeTable()
{
issueStatement("insert into UMP select ump_tmp.p1,ump_tmp.p2,ump_tmp.p3 from UMP_TMP left join UMP on UMP_TMP.p1 = UMP.P1 and UMP_TMP.p2 = UMP.P2 and UMP_TMP.p3 = UMP.P3 WHERE ump.p1 is null and ump.p2 is null and ump.p3 is null");
}
private void issueStatement(string command)
{
using (SqlConnection con = new SqlConnection("MyConnectionStr "))
{
using (SqlCommand cmd = con.CreateCommand())
{
con.Open();
cmd.CommandText = command;
//add error handling
cmd.ExecuteNonQuery();
}
}
}
答案 1 :(得分:0)
扩展@Kirk的响应,解决问题的最终目标是在两个表上执行左联接操作。您将需要确定每个表上的哪些列连接数据,以及哪些列使行唯一。
您可以在a)Access,b)SQL,c).NET中使用的3种环境中的任何一种来执行此操作。
我会推荐SQL,这是它的最佳选择。 (加上您仅通过客户端传输一组数据(访问数据)),因此将所有数据放入SQL表中,然后执行SQL存储过程以进行左联接并更新SQL数据表。
您可以仅使用Management Studio,查询等来进行SQL工作。一旦构建了存储过程(以及其他可能需要的视图)。然后,您的.NET代码就是两个简单的部分,1)上传Access数据2)调用proc进行合并。
最后一点,如果您的.net客户端唯一的目的是此上传和合并,那么您根本不需要它。 SQL Server SSIS可以完成所有这一切,根据所涉及数据的大小,可能是更好的选择。