以前很少用到Access數據庫,不過總感覺這些數據庫都是大同小異,支持標准SQL語句,但是用起來還是有很多地方的不同。最近做個小網站,覺得用sql server有點大財小用,故打算用Access來做,本以為很簡單,一上來的第一個add的操作就出了問題,進而減慢了項目的進度。以下就我個人遇到的問題及其解決方法,希望有錯誤的地方幫忙指正,謝謝!
常見錯誤一:“標准表達式中數據類型不匹配”
這是操作Access數據庫最常見的錯誤,我們處理sql語句一般都是用參數來出來,問題就是出在這里,比如下面的語句:
1 string sql = "insert into NewsComment(NC_NewsID,NC_UserName,NC_PostTime,NC_PostDetails) values(NC_NewsID,NC_UserName,NC_PostTime,NC_PostDetails)"; 2 OleDbParameter[] param = new OleDbParameter[]{ 3 new OleDbParameter("@NC_NewsID",comment.NC_NewsID), 4 new OleDbParameter("@NC_UserName",comment.NC_UserName), 5 new OleDbParameter("@NC_PostTime",comment.NC_PostTime), 6 new OleDbParameter("@NC_PostDetails",comment.NC_PostDetails), 7 };
運行就會出現上述錯誤,出現這種錯誤的原因是SQL可以智能的解析出int,string,datetime等數據類型,但是Access之后按照一種類型解析,當有int與string一起解析時,會將int解析為string類型故會出現這個錯誤,知道問題就好解決。
1 string sql = "insert into NewsComment(NC_NewsID,NC_UserName,NC_UserEmail,NC_UserSite,NC_PostTime,NC_PostDetails,NC_IsReply,NC_ReplyCommentID,NC_IsDisplay) values(@NC_NewsID,@NC_UserName,@NC_UserEmail,@NC_UserSite,@NC_PostTime,@NC_PostDetails,@NC_IsReply,@NC_ReplyCommentID,@NC_IsDisplay) "; 2 OleDbParameter[] param = new OleDbParameter[9]; 3 param[0] = new OleDbParameter("@NC_NewsID", OleDbType.Integer); 4 param[0].Value = comment.NC_NewsID; 5 param[1] = new OleDbParameter("@NC_UserName", OleDbType.VarChar, 50); 6 param[1].Value = comment.NC_UserName; 7 param[2] = new OleDbParameter("@NC_UserEmail", OleDbType.VarChar, 200); 8 param[2].Value = comment.NC_UserEmail; 9 param[3] = new OleDbParameter("@NC_UserSite", OleDbType.VarChar, 200); 10 param[3].Value = comment.NC_UserSite; 11 param[4] = new OleDbParameter("@NC_PostTime", OleDbType.DBTimeStamp); 12 param[4].Value=comment.NC_PostTime; 13 param[5] = new OleDbParameter("@NC_PostDetails", OleDbType.LongVarChar, 500); 14 param[5].Value = comment.NC_PostDetails; 15 param[6] = new OleDbParameter("@NC_IsReply", OleDbType.Boolean); 16 param[6].Value = comment.NC_IsReply; 17 param[7] = new OleDbParameter("@NC_ReplyCommentID", OleDbType.Integer); 18 param[7].Value=comment.NC_ReplyCommentID; 19 param[8] = new OleDbParameter("@NC_IsDisplay",OleDbType.Boolean); 20 param[8].Value = comment.NC_IsDisplay;
當Rebuild時還是出現了同樣的錯誤,我糾結了,又開始一個參數一個參數的檢查,最后才明白過來,問題出在DateTime類型上,當參數有DateTime類型時,我們指定為 OleDbType.DBTimeStamp類型,但是參數的Value確是DateTime類型時間,當向數據庫中插入時間類型要以'2012/05/06'的形式插入,故我們要將參數的value轉換成string類型。最終方案:
string sql = "insert into NewsComment(NC_NewsID,NC_UserName,NC_UserEmail,NC_UserSite,NC_PostTime,NC_PostDetails,NC_IsReply,NC_ReplyCommentID,NC_IsDisplay) values(@NC_NewsID,@NC_UserName,@NC_UserEmail,@NC_UserSite,@NC_PostTime,@NC_PostDetails,@NC_IsReply,@NC_ReplyCommentID,@NC_IsDisplay) "; OleDbParameter[] param = new OleDbParameter[9]; param[0] = new OleDbParameter("@NC_NewsID", OleDbType.Integer); param[0].Value = comment.NC_NewsID; param[1] = new OleDbParameter("@NC_UserName", OleDbType.VarChar, 50); param[1].Value = comment.NC_UserName; param[2] = new OleDbParameter("@NC_UserEmail", OleDbType.VarChar, 200); param[2].Value = comment.NC_UserEmail; param[3] = new OleDbParameter("@NC_UserSite", OleDbType.VarChar, 200); param[3].Value = comment.NC_UserSite; param[4] = new OleDbParameter("@NC_PostTime", OleDbType.DBTimeStamp); param[4].Value=comment.NC_PostTime.ToString(); param[5] = new OleDbParameter("@NC_PostDetails", OleDbType.LongVarChar, 500); param[5].Value = comment.NC_PostDetails; param[6] = new OleDbParameter("@NC_IsReply", OleDbType.Boolean); param[6].Value = comment.NC_IsReply; param[7] = new OleDbParameter("@NC_ReplyCommentID", OleDbType.Integer); param[7].Value=comment.NC_ReplyCommentID; param[8] = new OleDbParameter("@NC_IsDisplay",OleDbType.Boolean); param[8].Value = comment.NC_IsDisplay;
編譯通過,OK。
常見錯誤二:SELECT 子句中包含一個保留字、拼寫錯誤或丟失的參數,或標點符號不正確
出現這個錯誤的原因一是執行含有top @page這樣參數的sql語句:
1 string sql = "select top @Page T_ID,T_Name from TypeList where T_ParentID =@ParentID order by T_TypeOrder,T_CreateDate asc"; 2 OleDbParameter[] param = new OleDbParameter[2]; 3 param[0] = new OleDbParameter("@Page", OleDbType.Integer); 4 param[0].Value = Page; 5 param[1] = new OleDbParameter("@ParentID", OleDbType.Integer); 6 param[1].Value = ParentID;
這個問題的出現我很糾結,在網上搜過答案,但是沒有一個滿意的結果,可以參考我上篇博文:http://www.cnblogs.com/aces/archive/2012/04/28/Ace_Access.html 對於這個問題我覺得原因是Top 后面跟@page這樣參數造成的,這句在SQL數據庫中需要在寫成Top (@page) 這樣可以build通過。這個錯誤的解決辦法我目前采用的是字符串拼接,希望知道好的解決辦法的朋友分享下,小弟感激不盡。
出現上述錯誤原因二是執行Select top 0 from這樣的語句會報錯,這個很好解決,就是top后跟的參數做判斷不能小於1。
對於Access數據庫只是初步了解,有錯誤指出希望指出。