“Insert into 語句的語法錯誤”的解決方法

“Insert into 語句的語法錯誤”的解決方法

前段時間用vb.net+access做練習發現了個問題.我定義了一個非常簡單的select查詢在sql server企業管理器中沒問題,但在.net IDE中調試就通不過,提示 "使用OleDbCommandBuilder時出現“Insert into 語句的語法錯誤”的解決方法".後來發現是數據庫中表的字段名有問題,baidu一下找到下面的東東





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

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

再次測試,通過!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章