沒有軟件會不存在bug,找到一個bug只能說明系統還存在Bug。MyGeneration也不例外,其中存在存在bug;但我們不能因為其有bug而不去用它,這是因噎廢食。下面就是我在使用dOOdad時遇到的幾個bug及我自己的解決辦法,發出來與大家共享,避免大家與我做重復的調試工作。
1. 連接字符串初始化:
在配置文件web.config或app.config配置連接字符串。dOOdad項目中默認的key是"dbConnection",也可以修改BusinessEntity類中的_defaultConfig字段的值來修改key的默認值。
另外,dOOdad項目有個問題就是連接字符串并沒有初始化(可能是模版的bug),這時需要手動初始化。解決方法參看我的本系列第一篇文章《使用MyGeneration生成sp和代碼》中的part5。
2. 向數據庫中插入一行:
下面是dOOdad給定一份示例代碼,執行這段代碼會有點小問題:
Employees emps = new Employees();
emps.AddNew();
emps.LastName = "Smith";
emps.HireDate = DataTime.Now;
emps.Save();
int empsID = emps.EmplyeeID;//插入后返回主鍵值。
調用Save方法插入數據庫沒有問題,但是獲取主鍵值會拋出異常。默認生成的代碼沒有將ID作為輸出參數,所以Save后emps.EmplyeeID仍然為空,不能轉換成int。更正方法是在dOOdad生成業務實體抽象類Employees的GetInsertCommand()方法中加一條語句:
CreateParameters(cmd);
cmd.Parameters["@ID"].Direction = ParameterDirection.Output;//要加入的語句
return cmd;現在執行上面的示例代碼就不會出現異常了。
3. BusinessEntity中Setstring方法也存在問題:
protected void Setstring(string columnName, string data)
{
if(0 == data.Length)
_dataRow[columnName] = DBNull.Value;
else
_dataRow[columnName] = data;
}顯然,當為第二個參數data傳入null時,會有問題。修正:if的判斷條件改為:if ((null == data) || (0 == data.Length))但按照FxCop性能規則,這種判斷字符串非空的方法不是很高效,推薦用String.IsNullOrEmpty(data)來判斷是否為空。其他判讀字符串非空的地方也存在同樣的問題。
4. BusinessEntity類提供的ToXml()和FromXml()兩個方法,實現了字符串到業務實體的轉化。
不過這種是由代價的:ToXml將業務實體換成string后,會丟失部分重要信息,如DataSet的Schema、DataRow的狀態(Added/Modified/Deleted)、沒有賦值的屬性等,所以FromXml不能完全轉換回原來的DataTable。
例如:
Employee emps = new Employee();
emps.LoadByPrimaryKey(id)
string s = emp.ToXml();
Employee temp = new Employee();
temp.LoadFromXml(); 執行上面的代碼后,temp已經嚴重失真了。例如訪問temp.ID就會拋出InvalidCastException異常,訪問temp對象的其他非字符串屬性也會拋出該異常。產生這個問題原因可能是經過ToXml和FromXml轉換后,_dataRow[columnName]的數據類型信息丟失了,統一都成了string類型,強制類型轉換會拋出異常。
Getbool、Getint等一系列Get***方法(GetString除外)都存在這個問題,解決辦法是用Convert類來轉換,將強制類型轉換換成Convert.To***()。
5. 更多的Bug,正等著大家去發現^_^

浙公網安備 33010602011771號