string AccessSelectStr = @"SELECT  [NO],[NAME] ,[SHORTNAME]  FROM STATIONCFG";         
       DataTable AccessDt = GetDtBySelectFromAccess(AccessSelectStr);//该函数根据查询语句返回数据表,没有问题,并且数据表中没有记录.
       OleDbDataAdapter AccessAdapter = new OleDbDataAdapter(AccessSelectStr, AccessConn);
       DataRow dataRowAdded = AccessDt.NewRow();//添加记录前该表为空表
       dataRowAdded["NO"] = 1;//该字段为主键
       dataRowAdded["NAME"] = "aaa";
       dataRowAdded["SHORTNAME"] = "bbb";
    
       AccessDt.Rows.Add(dataRowAdded);       OleDbCommandBuilder Cmd = new OleDbCommandBuilder(AccessAdapter);
       AccessAdapter.Update(AccessDt);//该行出错
       AccessDt.AcceptChanges();
//string CmdText = @"Insert Into STATIONCFG ([NO], [Name], [ShortName]) Values (1,'aaa','bbb')";
//ExecuteNoQuery(CmdText);//直接执行这个也没有问题
//数据库连接没有问题,并且上述代码用于另一个表却没有问题
//错误信息如下:
System.Data.OleDb.OleDbException: INSERT INTO 语句的语法错误。
   在 System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
   在 System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
   在 System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
   在 System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)
   在 System.Data.Common.DbDataAdapter.Update(DataTable dataTable)

解决方案 »

  1.   

    string CmdText = @"Insert Into STATIONCFG ([NO], [Name], [ShortName]) Values (1,'aaa','bbb')"; 
    在这句话后边添加一句
    Console.WriteLine(CmdText );
    把这个sql语句打印出来,然后到数据库里面执行,看是否能插入
      

  2.   

    谢谢楼上的,你们所说的问题没有.
    string AccessSelectStr = @"SELECT  NOXX,NAMEXX ,SHORTNAME FROM STATIONCFG";    
    刚才做了个修改:将表STATIONCFG的三个字段名改为NOXX,NAMEXX ,SHORTNAME,上述代码就没有问题了,也就是ACCESS关键字括起来[]也没用,系统也认为你用了关键字做字段.
    那该如何将关键字转换成字段进行使用呢?
      

  3.   

    表STATIONCFG的字段NO,NAME都是access的关键字段,而SHORTNAME不是,用[SHORTNAME]可能会出现错误
    如果改成:
    string CmdText = @"Insert Into STATIONCFG ([NO], [Name], ShortName) Values (1,'aaa','bbb')"; 
    试试看,怎么样?
    我以前也遇到这个问题,将access关键字转换成普通的字段就是用[]
      

  4.   

    string CmdText = @"Insert Into STATIONCFG ([NO], [Name], ShortName) Values (1,'aaa','bbb')"; 
    ExecuteNoQuery(CmdText);
    //直接执行上面两行是没有问题 ,下面的就有问题:
          string AccessSelectStr = @"SELECT  [NO],[NAME] ,SHORTNAME  FROM STATIONCFG";        
          DataTable AccessDt = GetDtBySelectFromAccess(AccessSelectStr
          OleDbDataAdapter AccessAdapter = new OleDbDataAdapter(AccessSelectStr, AccessConn); 
          DataRow dataRowAdded = AccessDt.NewRow();
          dataRowAdded["NO"] = 1; 
          dataRowAdded["NAME"] = "aaa"; 
          dataRowAdded["SHORTNAME"] = "bbb"; 
        
          AccessDt.Rows.Add(dataRowAdded);       OleDbCommandBuilder Cmd = new OleDbCommandBuilder(AccessAdapter); 
          AccessAdapter.Update(AccessDt);//该行出错 
          AccessDt.AcceptChanges(); 
    我就是觉得上面的代码中方括号关键字没有起作用,郁闷!
      

  5.   

    dataRowAdded["NO"] = 1; 
    dataRowAdded["NAME"] = "aaa"; 
    dataRowAdded["SHORTNAME"] = "bbb"; 
    改成
    dataRowAdded["[NO]"] = 1; 
    dataRowAdded["[NAME]"] = "aaa"; 
    dataRowAdded["SHORTNAME"] = "bbb";
    试试看,可以不另外:
    AccessAdapter.Update(AccessDt);
    这个Update()方法是你自己定义的吗?
      

  6.   

    不行,提示:列[NO]不属于表
    AccessAdapter.Update(AccessDt); 
    这个Update()方法是你自己定义的吗?
      不是,OleDbDataAdapter自有的.
      

  7.   


    DataSet ds = new DataSet();
    OleDbDataAdapter AccessAdapter = new OleDbDataAdapter(AccessSelectStr, AccessConn); 
    AccessAdapter.Fill(ds,"Test");
    ds.Tables["Test"].Rows.Add(1,"aaa","bbb");
    OleDbCommandBuilder Cmd = new OleDbCommandBuilder(AccessAdapter); 
    AccessAdapter.Update(ds,"Test");你试试看行不?
      

  8.   


    DataSet ds = new DataSet();
    OleDbDataAdapter AccessAdapter = new OleDbDataAdapter(AccessSelectStr, AccessConn); 
    AccessAdapter.Fill(ds);
    ds.Tables.Rows.Add(1,"aaa","bbb");
    DataTable dt = ds.Table[0].GetChanges();
    ds.Tables[0].acceptChange();
    AccessAdapter.Update(ds);
    ds.Tables[0].Merge(dt);
    再看看这个
      

  9.   

    bingxue_84:
    前面一个不行,报同样的错误.
    后面一个不报错,但是记录没有写进数据库,好象下面
    ds.Tables[0].acceptChange();
    AccessAdapter.Update(ds);
    ds.Tables[0].Merge(dt);
    顺序有点问题
      

  10.   

    没插入数据会不会是
    ds.Tables[0].Rows.Add(1,"aaa","bbb");
      

  11.   

    好像是这样的DataSet ds = new DataSet();
    OleDbDataAdapter AccessAdapter = new OleDbDataAdapter(AccessSelectStr, AccessConn); 
    AccessAdapter.Fill(ds);
    DataRow dataRowAdded = AccessDt.NewRow(); 
    dataRowAdded["NO"] = 1;
    dataRowAdded["NAME"] = "aaa"; 
    dataRowAdded["SHORTNAME"] = "bbb"; 
    ds.Tables.Rows.Add(dataRowAdded);
    DataTable dt = ds.Table[0].GetChanges();
    ds.Tables[0].acceptChange();
    AccessAdapter.Update(ds);
    ds.Tables[0].Merge(dt);
      

  12.   


    DataSet ds = new DataSet();
    OleDbDataAdapter AccessAdapter = new OleDbDataAdapter(AccessSelectStr, AccessConn); 
    AccessAdapter.Fill(ds);
    DataRow dataRowAdded = ds.Tables[0].NewRow(); 
    dataRowAdded["NO"] = 1;
    dataRowAdded["NAME"] = "aaa"; 
    dataRowAdded["SHORTNAME"] = "bbb"; 
    ds.Tables.Rows.Add(dataRowAdded);
    DataTable dt = ds.Table[0].GetChanges();
    ds.Tables[0].acceptChange();
    AccessAdapter.Update(ds);
    ds.Tables[0].Merge(dt);你看看这个怎么样不好意思啊!我也是刚学C#,一遍一遍的回帖都不好意思了,各位见谅啊
      

  13.   

    DataSet ds = new DataSet();
    OleDbDataAdapter AccessAdapter = new OleDbDataAdapter(AccessSelectStr, AccessConn); 
    AccessAdapter.Fill(ds);
    DataRow dataRowAdded = ds.Tables[0].NewRow(); 
    dataRowAdded["NO"] = 1;
    dataRowAdded["NAME"] = "aaa"; 
    dataRowAdded["SHORTNAME"] = "bbb"; 
    ds.Tables.Rows.Add(dataRowAdded);
    DataTable dt = ds.Table[0].GetChanges();
    ds.Tables[0].acceptChange();
    //AccessAdapter.Update(ds);
    //改成
    AccessAdapter.Insert(ds);
    ds.Tables[0].Merge(dt);
      

  14.   


    谢谢各位的回答,找到问题的原因了:
          string AccessSelectStr = @"SELECT  [NO],[NAME] ,SHORTNAME  FROM STATIONCFG";        
          DataTable AccessDt = GetDtBySelectFromAccess(AccessSelectStr 
          OleDbDataAdapter AccessAdapter = new OleDbDataAdapter(AccessSelectStr, AccessConn); 
          DataRow dataRowAdded = AccessDt.NewRow(); 
          dataRowAdded["NO"] = 1; 
          dataRowAdded["NAME"] = "aaa"; 
          dataRowAdded["SHORTNAME"] = "bbb"; 
        
          AccessDt.Rows.Add(dataRowAdded);       OleDbCommandBuilder Cmd = new OleDbCommandBuilder(AccessAdapter);
          //增加以下两行  OK
          Cmd.QuotePrefix = "[";
          Cmd.QuoteSuffix = "]";      AccessAdapter.Update(AccessDt);//该行出错 
           AccessDt.AcceptChanges();