當我們用C#開發數據庫訪問程序的時候,通常有3種方式:odbc,oleDb,ado.Net;其實我想對於這三種方式,這個問題都會出現,但是這次我遇到問題的時候用的是oleDb的方式,我們就用oleDb的方式來描述吧。
問題描述:
我用OleDb的方式向Access數據裡寫數據,示例源碼如下:
用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類就可了:
打開MSDN,看看OleDbCommanBuilder的類成員。發現兩個很關鍵的屬性:QuotePrefix,QuoteSuffix;仔細想想,OleDb可以訪問的數據類型非常多啊,所以關鍵字段的前綴,後綴的處理方法肯定不盡相同,比如訪問Excel的時候表明應該寫成[sheet1$的方式],所以提供這樣一種方式是相當靈活的。接下來我再次修改代碼,對這兩個屬性賦值:
再次測試,通過!
在網上搜索了一下,遇到這個問題的人不少,不過都是選擇了改字段名,並不是一個徹底解決的方法,沒有很好利用這個靈活性,所以把我遇到這個問題的解決方法寫出來,希望對大家有所幫助。