天天看點

Access用OleDbParameter無法更新資料解決方案

昨天遇到了一個非常郁悶的問題,這個問題我幾乎花了一天的時間才找到了造成問題的症結并解決。
    問題是這樣,原本一個使用Sqlserver資料庫的系統,我要讓它實作Access資料接口,即我可以很友善地把這個系統從SqlServer資料庫切換到Access資料庫,由于此系統采用了抽象工廠模式,隻需增加一個Access資料庫的接口層即可,我采用了DbHelperOleDb,然後寫了OleDbDAL資料層接口。調試的時候,其它一切順利,我暗喜,覺得輕松搞定資料庫接口層的轉換很了不起,可是當我在背景更新資料的時候,沒有出錯,但就是資料無法更新,曾懷疑對資料庫的權限操作問題,但是插入和删除資料都是OK的,排除了這個可能,什麼問題?我就在裡面糾纏了很久,嘗試了很多方式,走了不少彎路,問了不少人,百度谷歌了不少資料,幾乎花了一天的時間,在無意中,有一處資料更新終于成功了,但是我不知什麼原因使得它終于成功了,但是它讓我看到了勝利的曙光,我再研究了其它處不成功的更新,并仔細檢視不成功和成功更新的差別,天啊,原來問題就是在access資料庫裡面,OleDbParameter[] parameters = {}裡面的參數是順序是一定要按Update語句裡面變量的順序的,但是SqlServer資料庫則沒有這個要求!
    下面把正确的寫法貼出來,在網上也有不少朋友遇到過這樣的問題,希望這個資訊對他們有幫助。
特别注意的是,在 OleDbParameter[] parameters = {}數組裡面參數的順序一定要和Update語句裡面的參數的順序一緻。
           
/// <summary>
/// 更新一條資料
/// </summary>
public void Update(ZPY.Model.News model)
{
StringBuilder strSql=new StringBuilder();
strSql.Append("update News set ");
strSql.Append("[email protected],");
strSql.Append("[email protected],");
strSql.Append("[email protected],");
strSql.Append("[email protected],");
strSql.Append("[email protected],");
strSql.Append("[email protected],");
strSql.Append("[email protected],");
strSql.Append("[email protected],");
strSql.Append("[email protected],");
strSql.Append("[email protected],");
strSql.Append("[email protected]");
strSql.Append(" where [email protected] ");
OleDbParameter[] parameters = {
// 注意裡面參數的順利一定要和Update語句裡面參數是順序一緻,比如Update語句裡面第一個參數
// 是@NewTitle,這裡也是,Update語句裡面最後一個參數是@ID,這樣最後一個參數一定要是@ID
new OleDbParameter("@NewsTitle", OleDbType.VarChar,100),
new OleDbParameter("@NewsContent", OleDbType.VarChar,0),
new OleDbParameter("@NewsFrom", OleDbType.VarChar,50),
new OleDbParameter("@NewsTime", OleDbType.Date),
new OleDbParameter("@DefaultPic", OleDbType.VarChar,100),
new OleDbParameter("@BigClassID", OleDbType.Integer,4),
new OleDbParameter("@SmallClassID", OleDbType.Integer,4),
new OleDbParameter("@Hits", OleDbType.Integer,4),
new OleDbParameter("@IsTop", OleDbType.Boolean,2),
new OleDbParameter("@IsPass", OleDbType.Boolean,2),
new OleDbParameter("@AddMan", OleDbType.VarChar,50),
new OleDbParameter("@ID", OleDbType.Integer,4),
};

parameters[0].Value = model.NewsTitle;
parameters[1].Value = model.NewsContent;
parameters[2].Value = model.NewsFrom;
parameters[3].Value = model.NewsTime;
parameters[4].Value = model.DefaultPic;
parameters[5].Value = model.BigClassID;
parameters[6].Value = model.SmallClassID;
parameters[7].Value = model.Hits;
parameters[8].Value = model.IsTop;
parameters[9].Value = model.IsPass;
parameters[10].Value = model.AddMan;
parameters[11].Value = model.ID;
DbHelperOleDb.ExecuteSql(strSql.ToString(),parameters);
}