C# 大家好。我想从access数据库将值导入sql,但以前从access添加的记录除外
将值从我的access数据库获取到C# 大家好。我想从access数据库将值导入sql,但以前从access添加的记录除外,c#,.net,C#,.net,将值从我的access数据库获取到DataTable 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(accesscon
DataTable
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数据库获取到数据表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);
}
}
现在,我想从access数据库将值导入sql数据库,但之前从access数据库添加的记录除外。我该怎么做
//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;
}
}
}
}
//问题出在这里
使用(SqlConnection con=newsqlconnection(“MyConnectionStr”))
{
使用(SqlCommand cmd=new SqlCommand())
{
cmd.CommandText=“插入UMP值(@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
我的建议是获取所有访问数据并将其插入临时表中
然后根据左联接插入数据,执行插入
你的代码看起来像这样
//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();
}
}
}
//来自access的数据
私有void insertValues(数据表)
{
使用(SqlConnection con=newsqlconnection(“MyConnectionStr”))
{
使用(SqlCommand cmd=con.CreateCommand())
{
createTable();
//注意:已将insert更改为tmp表格。
cmd.CommandText=“插入UMP_TMP值(@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
通过扩展@Kirk的响应,您解决问题的最终目标是对两个表执行左联接操作。您需要确定每个表上哪些列连接数据,哪些列使行唯一
您可以在a)Access、b)SQL、c).NET中的3种环境中的任意一种环境中执行此操作
我推荐SQL,它是最好的。(再加上您仅通过客户端传输一组数据(访问数据)),因此将所有数据放入SQL表中,然后执行SQL存储过程来执行左连接并更新SQL数据表
一旦构建了存储过程(以及其他可能需要的视图),就可以使用ManagementStudio、查询等来完成SQL工作。NET代码是两个简单的部分,1)上载访问数据2)调用进程合并它
最后一点,如果你的.net客户端的唯一目的就是上传和合并,那么你根本不需要它。SQL Server SSI可以完成所有这一切,根据所涉及数据的大小,可能是更好的选择。我正在努力理解您的问题,您能否更具体一点?正如@AlexRiabov之前所指出的,我们需要更多信息。我看到的只是一堵代码墙。请添加有关您要执行的操作、预期输出和一些测试数据的信息。这是一个好主意,我尝试过,但得到的错误是System.data.SqlClient.SqlException:'附近的语法不正确';'到cmd.ExecuteNonQuery();我添加了错误处理。哎呀,对不起,我的错误更新了上面的代码。创建表方法不正确。它现在可以工作了。我在考虑比较2数据表和添加第三个数据表,但最好避免使用数据表。这更有用。谢谢。太好了,很高兴它有帮助。