2012-05-18 23 views
0

在這裏,我對存儲過程感到困惑。這裏,我們將所有數據庫相關操作應用到代碼中:我們可以在mvvm中應用存儲過程嗎?用理由解釋

string query = "insert into accounts(name, opening_balance, category, address, contact_person, phone_number) values(" 
           + "'" + account.Name + "'," 
           + account.OpeningBalance + "," 
           + account.Category.Id + "," 
           + "'" + account.Address + "'," 
           + "'" + account.ContactPerson + "'," 
           + "'" + account.PhoneNumber + "')"; 
      account.Id = SQLiteHelper.ExecuteInsert(query); 

我們可以將它應用於存儲過程嗎?如果是這樣:怎麼樣?存儲過程優於它的優點是什麼?

+2

您的代碼可能有SQL注入漏洞。 –

+2

MVVM和存儲過程是正交的 - 您可以分別使用兩者或每個。 – Oded

+0

@Oded:嘿,你可以看到我的代碼我們正在使用SQLite數據庫。在SQLite商店程序適用? – prjndhi

回答

3

MVVM與您的SQL問題無關。

基本上,您不應該將值串入SQL表達式中,因爲它允許最終用戶注入SQL代碼。即。 真的不好主意

存儲過程使您可以更好地控制參數並避免注入攻擊。它還允許您進行微妙的更改,例如如果數據庫稍微改變,不改變調用C#代碼。

不幸的是,SQLite似乎不支持存儲過程,所以你可能想改變你的方法。看看這個鏈接:http://www.sqlite.org/whentouse.html

如果你必須堅持使用SQLite,而不是說SQL CE,那麼你需要向你的代碼添加驗證檢查以確保沒有插入SQL語句。

+0

嘿,這個項目是做桌面應用程序。如果我們想用它作爲web應用程序那麼我們將視圖改爲silver light。但那時我們可能不會使用sqlite根據缺點。那麼我們必須更改所有在文件中的查詢以在SP中進行轉換? – prjndhi

+0

無論如何,你應該改變你的查詢,因爲它們不安全,但是如果你確實去了一個web應用程序,你可以使用一個合適的SQL服務器。如果可以的話,你應該使用實體框架和LINQ to SQL,而不是簡單的SQL命令。實體框架和LINQ都旨在使數據庫工作更容易編碼。 –

0
  1. 您應該檢查sql中插入的值以避免 sql-injection。
  2. 數據訪問代碼不應該在視圖模型中。它應該在模型中。
相關問題