程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 使用OleDbCommandBuilder時出現“Insert into 語句的語法錯誤”的解決方法

使用OleDbCommandBuilder時出現“Insert into 語句的語法錯誤”的解決方法

編輯:.NET實例教程

 當我們用C#開發數據庫訪問程序的時候,通常有3種方式:odbc,oleDb,ado.Net;其實我想對於這三種方式,這個問題都會出現,但是這次我遇到問題的時候用的是oleDb的方式,我們就用oleDb的方式來描述吧。

問題描述:

     我用OleDb的方式向Access數據裡寫數據,示例源碼如下: 

 



string sql="select * from MultiTable";
    OleDbDataAdapter oleSub=new OleDbDataAdapter(sql,oleCn);
    OleDbCommandBuilder cb1=new OleDbCommandBuilder(oleSub);

   DataSet ds=new DataSet();

   oleSub.Fill(ds."MultiTable");

   DataTable dt=ds.Tables["MultiTable"];

   DataRow dr=dt.NewRow();

   dr["PRSERV"]="WS"+index.ToString().PadLeft(6,''0'');

  dr["NUMBER"]="00063";

 ....................................

  dt.Rows.Add(dr);

  oleSub.Update(ds,"MulitTable");

這段代碼編譯的時候是沒有問題的,但是在運行的時候,會報出一個運行時錯誤:”Insert into 語句的語法錯誤“。

   用OleDbAdapter的時候,我並沒有指定Insert語句,而是用OleDbCommandBuilder 來自動產生Insert 語句的。仔細想了一下,為什麼會產生這個錯誤呢?我的結論是,可能這張表裡的字段名使用了access系統的保留字。於是我在Access裡創建了一個查詢,自己寫了一個insert sql,證實我的結論是正確的,NUMBER是系統的一個保留字,那怎麼修改呢?

   一般來說,最簡單的方法就是改掉這個字段名,換成非系統保留字的名字,但是庫的結構是客戶提供的,不允許修改,只有想別的辦法。考慮以前的經驗,操作Access,SQL Server的時候,如果表的字段中包含了系統的保留字的話,我們在字段外加上方括號就可以了,比如 insert into tblmultitable(prserv,[NUMBER]) values(.......)就可以了。可是從上面的代碼中我們看到並沒有什麼地方我們可以指定Insert 語句。我想OleDbCommandBuilder應該是根據Adapter使用的select語句自動生成insert 語句的,所以只要給select 語句中的字段加上方括號就可以了,所以我作了如下的修改:

   string sql="select PRSERV,[NUMBER],PriorRef,Grantor,Grantee from MultiTable";

   修改完畢以後,測試以後,仍然產生以前的"Insert into 語句的語法錯誤";問題會出在哪裡呢?我想應該還是在OleDbCommanBuilder上,一般來說,只需要這樣用OleDbCommanBuilder類就可了:



OleDbDataAdapter oleSub=new OleDbDataAdapter(sql,oleCn);
    OleDbCommandBuilder cb1=new OleDbCommandBuilder(oleSub);

打開MSDN,看看OleDbCommanBuilder的類成員。發現兩個很關鍵的屬性:QuotePrefixQuoteSuffix;仔細想想,OleDb可以訪問的數據類型非常多啊,所以關鍵字段的前綴,後綴的處理方法肯定不盡相同,比如訪問Excel的時候表明應該寫成[sheet1$的方式],所以提供這樣一種方式是相當靈活的。接下來我再次修改代碼,對這兩個屬性賦值:



OleDbDataAdapter oleSub=new OleDbDataAdapter(sql,oleCn);
    OleDbCommandBuilder cb1=new OleDbCommandBuilder(oleSub);
    cb1.QuotePrefix="[";
    cb1.QuoteSuffix="]";

再次測試,通過!

  在網上搜索了一下,遇到這個問題的人不少,不過都是選擇了改字段名,並不是一個徹底解決的方法,沒有很好利用這個靈活性,所以把我遇到這個問題的解決方法寫出來,希望對大家有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved