版權聲明:歡迎評論和轉載,轉載請注明來源。 https://blog.csdn.net/zy332719794/article/details/7945654
“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類就可了:
OleDbCommandBuilder cb1=new OleDbCommandBuilder(oleSub); 這句比能少——會報“當傳遞具有新行的 DataRow 集合時...”的錯
打開MSDN,看看OleDbCommanBuilder的類成員。發現兩個很關鍵的屬性:QuotePrefix,QuoteSuffix;仔細想想,OleDb可以通路的資料類型非常多啊,是以關鍵字段的字首,字尾的處理方法肯定不盡相同,比如通路Excel的時候表明應該寫成[sheet1$的方式],是以提供這樣一種方式是相當靈活的。接下來我再次修改代碼,對這兩個屬性指派:
cb1.QuotePrefix="[";
cb1.QuoteSuffix="]";
再次測試,通過!