“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="]";
再次測試,通過!