2013-03-25 55 views
1

我使用下面的代码将一个记录从一个数据库插入另一个数据库,但它不起作用。我试过MS-ACCESS 2007中的查询,它工作正常,但从我的C#代码以编程方式调用时不起作用?用c#代码插入ms访问另一个数据库的数据库

string query_insert = "INSERT INTO Questionnaires_Table(BranchName,Factor,Region,Branch_ID,Current_Date,No_Employees) " 
    + "SELECT BranchName,Factor,Region,Branch_ID,Current_Date,No_Employees " 
    + "FROM Questionnaires_Table IN '" + dialog.FileName + "' Where Branch_ID = " + textBox1.Text ; 

dbConnDest.Open(); 


    OleDbDataAdapter dAdapter = new OleDbDataAdapter(); 
    OleDbCommand cmd_insert = new OleDbCommand(query_insert, dbConnDest); 

    dAdapter.InsertCommand = cmd_insert; 
    cmd_insert.ExecuteNonQuery(); 

dbConnDest.Close(); 

当我走在MS Access中的的​​内容,它工作正常

它抛出

INSERT INTO语法错误例外线 cmd_insert.ExecuteNonQuery();

编辑

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Data.OleDb; 

namespace WindowsFormsApplication4 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 

      OpenFileDialog dialog = new OpenFileDialog(); 

      dialog.Title = "select database"; 



      if ((dialog.ShowDialog() == DialogResult.OK) && (textBox1.Text == "")) 
      { 
        MessageBox.Show("insert reference year", "", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
      else 
      { 




        OleDbConnection dbConnDest; 
        dbConnDest = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source= C:\Users\SystemA.accdb;Persist Security Info=False;"); 

        try 
        { 



         string query_insert = "INSERT INTO Questionnaires_Table(BranchName,Factor,Region,Branch_ID,Current_Date,No_Employees) " 
               + "SELECT BranchName,Factor,Region,Branch_ID,Current_Date,No_Employees " 
               + "FROM Questionnaires_Table1 IN '" + dialog.FileName + "' Where ReferenceYear = " + textBox1.Text + ";"; 




         dbConnDest.Open(); 



         OleDbCommand cmd_insert = new OleDbCommand(query_insert, dbConnDest); 

         try 
         { 
          cmd_insert.ExecuteNonQuery(); 
         } 
         catch (Exception g) 
         { 
          MessageBox.Show(g.ToString()); 
         } 



         textBox2.Text = query_insert.ToString(); 

         dbConnDest.Close(); 
        } 
        catch (Exception h) 
        { 
         MessageBox.Show(h.ToString()); 
        } 



       } 


     } 

    } 
} 

编辑

+0

[insert into ms access database]可能重复(http://stackoverflow.com/questions/15618165/insert-into-ms-access-database) – 2013-03-25 17:12:25

+0

您确定您正确使用IN吗? – JMK 2013-03-25 17:22:07

+1

你从哪里得到语法'FROM table IN filename'? – Steve 2013-03-25 17:37:17

回答

1

我发现了一个不同的语法in this Microsoft forum

INSERT INTO [AccessTable] SELECT * FROM [MS Access;DATABASE=D:\My Documents\db2.mdb].[Table2] 

,所以你可以试试这个

string query_insert = "INSERT INTO Questionnaires_Table " + 
    "(BranchName,Factor,Region,Branch_ID,[Current_Date],No_Employees) " + 
    "SELECT BranchName,Factor,Region,Branch_ID,[Current_Date],No_Employees " + 
    "FROM [MS Access;DATABASE=" + dialog.FileName + "].Questionnaires_Table " + 
    "Where Branch_ID = @branch"; 

dbConnDest.Open(); 
OleDbCommand cmd_insert = new OleDbCommand(query_insert, dbConnDest); 
cmd_insert.Parameters.AddWithValue("@branch", textBox1.Text); 
cmd.ExecuteNonQuery(); 

测试了"Provider=Microsoft.ACE.OLEDB.12.0;"

然而,随着更多的研究,很明显,给出的语法错误是由于存在于CURRENT_DATE reserved keyword。这可以解决用方括号封装字段名称。

顺便说一句,一旦解决了CURRENT_DATE问题,IN语法也可以正常工作。

+0

我使用IN,因为源数据库与目标数据库不同 – user2183831 2013-03-25 17:53:02

+0

我正在使用MS ACCESS 2007。accdb我测试但仍然没有任何反应谢谢你反正你的勇气 – user2183831 2013-03-25 19:12:28

+0

我用完整的代码更新我的问题 – user2183831 2013-03-25 21:23:08

1

你缺少 '价值' 在query_insert关键字。

+2

值是SELECT查询 – user2183831 2013-03-25 17:15:35

0

我不是很熟悉ms访问查询,但我认为你不应该使用OleDbDataAdapter。该代码应类似于以下内容:

string query_insert = "INSERT INTO Questionnaires_Table(BranchName,Factor,Region,Branch_ID,Current_Date,No_Employees) " 
    + "SELECT BranchName,Factor,Region,Branch_ID,Current_Date,No_Employees " 
    + "FROM Questionnaires_Table IN '" + dialog.FileName + "' Where Branch_ID = " + textBox1.Text ; 

dbConnDest.Open(); 

OleDbCommand cmd_insert = new OleDbCommand(query_insert, dbConnDest); 
cmd_insert.ExecuteNonQuery(); 

dbConnDest.Close(); 
+0

仍然无法正常工作它会抛出相同的异常 – user2183831 2013-03-25 17:21:19

+0

你知道有任何其他方式插入一个记录从一个数据库表到其他数据库表吗? – user2183831 2013-03-25 17:25:13

+0

@ user2183831,是的,但我没有使用ms-access一段时间。我徘徊的是有没有什么方法可以在访问中明确设置数据库模式?因为它看起来像插入到您查询的同一张表中。 – 2013-03-25 17:29:02

0

和其他人一样,这是一个SQL语法问题。您缺少VALUES关键字,请看:

INSERT INTO TABLENAME (COL1, COL2, COL2) VALUES (VAL1, VAL2, VAL3) 

您的VALUES关键字在哪里?

+0

在SELECT查询 – user2183831 2013-03-25 18:48:35

+0

@ user2183831: 第一:尽量写VALUES关键字,如: INSERT INTO(COL1,COL2,COL3)VALUES(SELECT(COL1,COL2,COL3)FROM ...) 二:尝试在您的Command对象中使用SqlParam而不是连接字符串。 你会更好地找到错误来源。 – 2013-03-25 19:10:55

+0

我还是有同样的例外 – user2183831 2013-03-25 19:43:28

相关问题