關於Access數據庫操作常見錯誤


    以前很少用到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數據庫只是初步了解,有錯誤指出希望指出。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM