net insert into語法錯(cuò)誤詳解
更新時(shí)間:2013年11月11日 09:38:21 作者:
本文說下net insert into語法錯(cuò)誤的原理和解決方法
問題描述:
我用oledb的方式向access數(shù)據(jù)里寫數(shù)據(jù),示例源碼如下:
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");
這段代碼編譯的時(shí)候是沒有問題的,但是在運(yùn)行的時(shí)候,會(huì)報(bào)出一個(gè)運(yùn)行時(shí)錯(cuò)誤:”insert into 語句的語法錯(cuò)誤“。用oledbadapter的時(shí)候,我并沒有指定insert語句,而是用oledbcommandbuilder 來自動(dòng)產(chǎn)生insert 語句的。仔細(xì)想了一下,為什么會(huì)產(chǎn)生這個(gè)錯(cuò)誤呢?我的結(jié)論是,可能這張表里的字段名使用了access系統(tǒng)的保留字。于是我在access里創(chuàng)建了一個(gè)查詢,自己寫了一個(gè)insert sql,證實(shí)我的結(jié)論是正確的,number是系統(tǒng)的一個(gè)保留字,那怎么修改呢?
一般來說,最簡(jiǎn)單的方法就是改掉這個(gè)字段名,換成非系統(tǒng)保留字的名字,但是庫(kù)的結(jié)構(gòu)是客戶提供的,不允許修改,只有想別的辦法。考慮以前的經(jīng)驗(yàn),操作access,sql server的時(shí)候,如果表的字段中包含了系統(tǒng)的保留字的話,我們?cè)谧侄瓮饧由戏嚼ㄌ?hào)就可以了,比如 insert into tblmultitable(prserv,[number]) values(.......)就可以了??墒菑纳厦娴拇a中我們看到并沒有什么地方我們可以指定insert 語句。我想oledbcommandbuilder應(yīng)該是根據(jù)adapter使用的select語句自動(dòng)生成insert 語句的,所以只要給select 語句中的字段加上方括號(hào)就可以了,所以我作了如下的修改:
string sql="select prserv,[number],priorref,grantor,grantee from multitable";
修改完畢以后,測(cè)試以后,仍然產(chǎn)生以前的"insert into 語句的語法錯(cuò)誤";問題會(huì)出在哪里呢?我想應(yīng)該還是在oledbcommanbuilder上,一般來說,只需要這樣用oledbcommanbuilder類就可了:
oledbdataadapter olesub=new oledbdataadapter(sql,olecn);
oledbcommandbuilder cb1=new oledbcommandbuilder(olesub);
打開msdn,看看oledbcommanbuilder的類成員。發(fā)現(xiàn)兩個(gè)很關(guān)鍵的屬性:quoteprefix,quotesuffix;仔細(xì)想想,oledb可以訪問的數(shù)據(jù)類型非常多啊,所以關(guān)鍵字段的前綴,后綴的處理方法肯定不盡相同,比如訪問excel的時(shí)候表明應(yīng)該寫成[sheet1$的方式],所以提供這樣一種方式是相當(dāng)靈活的。接下來我再次修改代碼,對(duì)這兩個(gè)屬性賦值:
ataadapter olesub=new oledbdataadapter(sql,olecn);
oledbcommandbuilder cb1=new oledbcommandbuilder(olesub);
cb1.quoteprefix="[";
cb1.quotesuffix="]";
我用oledb的方式向access數(shù)據(jù)里寫數(shù)據(jù),示例源碼如下:
復(fù)制代碼 代碼如下:
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");
這段代碼編譯的時(shí)候是沒有問題的,但是在運(yùn)行的時(shí)候,會(huì)報(bào)出一個(gè)運(yùn)行時(shí)錯(cuò)誤:”insert into 語句的語法錯(cuò)誤“。用oledbadapter的時(shí)候,我并沒有指定insert語句,而是用oledbcommandbuilder 來自動(dòng)產(chǎn)生insert 語句的。仔細(xì)想了一下,為什么會(huì)產(chǎn)生這個(gè)錯(cuò)誤呢?我的結(jié)論是,可能這張表里的字段名使用了access系統(tǒng)的保留字。于是我在access里創(chuàng)建了一個(gè)查詢,自己寫了一個(gè)insert sql,證實(shí)我的結(jié)論是正確的,number是系統(tǒng)的一個(gè)保留字,那怎么修改呢?
一般來說,最簡(jiǎn)單的方法就是改掉這個(gè)字段名,換成非系統(tǒng)保留字的名字,但是庫(kù)的結(jié)構(gòu)是客戶提供的,不允許修改,只有想別的辦法。考慮以前的經(jīng)驗(yàn),操作access,sql server的時(shí)候,如果表的字段中包含了系統(tǒng)的保留字的話,我們?cè)谧侄瓮饧由戏嚼ㄌ?hào)就可以了,比如 insert into tblmultitable(prserv,[number]) values(.......)就可以了??墒菑纳厦娴拇a中我們看到并沒有什么地方我們可以指定insert 語句。我想oledbcommandbuilder應(yīng)該是根據(jù)adapter使用的select語句自動(dòng)生成insert 語句的,所以只要給select 語句中的字段加上方括號(hào)就可以了,所以我作了如下的修改:
string sql="select prserv,[number],priorref,grantor,grantee from multitable";
修改完畢以后,測(cè)試以后,仍然產(chǎn)生以前的"insert into 語句的語法錯(cuò)誤";問題會(huì)出在哪里呢?我想應(yīng)該還是在oledbcommanbuilder上,一般來說,只需要這樣用oledbcommanbuilder類就可了:
oledbdataadapter olesub=new oledbdataadapter(sql,olecn);
oledbcommandbuilder cb1=new oledbcommandbuilder(olesub);
打開msdn,看看oledbcommanbuilder的類成員。發(fā)現(xiàn)兩個(gè)很關(guān)鍵的屬性:quoteprefix,quotesuffix;仔細(xì)想想,oledb可以訪問的數(shù)據(jù)類型非常多啊,所以關(guān)鍵字段的前綴,后綴的處理方法肯定不盡相同,比如訪問excel的時(shí)候表明應(yīng)該寫成[sheet1$的方式],所以提供這樣一種方式是相當(dāng)靈活的。接下來我再次修改代碼,對(duì)這兩個(gè)屬性賦值:
復(fù)制代碼 代碼如下:
ataadapter olesub=new oledbdataadapter(sql,olecn);
oledbcommandbuilder cb1=new oledbcommandbuilder(olesub);
cb1.quoteprefix="[";
cb1.quotesuffix="]";
相關(guān)文章
.NET做人臉識(shí)別并分類的實(shí)現(xiàn)示例
這篇文章主要介紹了.NET做人臉識(shí)別并分類示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11詳解ASP.NET Core3.0 配置的Options模式
這篇文章主要介紹了詳解ASP.NET Core3.0 配置的Options模式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08asp.net 操作XML 按指定格式寫入XML數(shù)據(jù) WriteXml
從SQL下載數(shù)據(jù)到本地為XML文件2009-07-07asp.net 虛擬主機(jī)時(shí)常出現(xiàn)MAC驗(yàn)證失敗錯(cuò)誤之解決方法
驗(yàn)證視圖狀態(tài) MAC 失敗。如果此應(yīng)用程序由網(wǎng)絡(luò)場(chǎng)或群集承載,請(qǐng)確保 <machineKey> 配置指定了相同的 validationKey 和驗(yàn)證算法。不能在群集中使用 AutoGenerate。2009-05-05.NET的基元類型包括什么及Unmanaged和Blittable類型詳解
這篇文章主要介紹了.NET的基元類型包括什么及Unmanaged和Blittable類型詳解,Unmanaged類型可以理解不涉及托管對(duì)象引用的值類型,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06Visual Studio 2017 IDE安裝使用圖文教程
這篇文章主要為大家詳細(xì)介紹了Visual Studio 2017 IDE安裝使用圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09