2012-07-21 61 views
-1

我很新的ASP.NET,我認爲我沒有用它們的方式它的意思是用所有的功能打包到最新的.NET框架。我目前正在使用.NET Framework 4.0。代碼中有一些錯誤,不介意他們介意我們似乎使用古老技術的方式。古老的ASP.NET結構,告訴我怎麼做正確

我已經構建了這樣的一切。

我文件調用webservice.cs,該文件是擠滿了webMethods的是這樣的:

[WebMethod] 
public string laggtillprodukt(string pro1, int pro2) 
{ 
    int sqlstatus; 
    string sqlinsertstringfull = "INSERT INTO t_produkter (produkt_namn) VALUES ('" + pro1 + "');" + 
           "SELECT produkt_id FROM t_produkter WHERE (produkt_id = SCOPE_IDENTITY()); " + 
           "INSERT INTO t_produktegenskaper (produkt_id, egenskaps_id) " + 
           "SELECT SCOPE_IDENTITY(), egen.egenskap_id " + 
           "FROM t_kopplingmallegenskaper as egen " + 
           "WHERE egen.mall_id = " + pro2 + ";"; 

    sqlstatus = executeWriteSqlQuery(sqlinsertstringfull); 

    return "These values has been added to the db" + pro1 + " and " + pro2 + " SQL STATUS:" + sqlstatus; 
} 

在我後面的代碼我這樣做是爲了調用正確的函數(下面的一個無關用的WebMethod它以前只是想說明許多SQL查詢之一。

protected void laggtillnymallbutton_Click(object sender, EventArgs e) 
{ 
    WebService globalwebservice = new WebService(); 

    if (string.IsNullOrWhiteSpace(laggtillnymall.Text)) 
    { 
     Label1.Text = "String cannot be empty or just whitespaces!"; 
    } 
    else 
    { 
     globalwebservice.laggtillmall(laggtillnymall.Text.Trim()); 
     Label1.Text = "Template added"; 
    } 

我不能在一個更effiecient的方式這樣做。我已經構建了所有的webMethods要麼使用insertdata或讀取數據的一般方法,爲我保存了一些代碼,但是我看到了像LINQ這樣的東西遠遠少於我的代碼。請幫助我或指向一個不太古老的編碼方式;)

+3

您的數據訪問方法容易受到[SQL注入](http://en.wikipedia.org/wiki/SQL_injection) - 您應該使用[參數化查詢](http://www.codinghorror而是使用.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html)。 – Oded 2012-07-21 10:06:36

+0

我發現很難在你的文章中找到一個實際的問題 - 除了一般的「幫助使這個更好」,這不是什麼堆棧溢出是關於 - 如果是這樣的話,[代碼評論](http:///codereview.stackexchange.com)可能是這個問題的更好的家園。請澄清。 – Oded 2012-07-21 10:11:54

+0

@Oded - 我同意,如果除了SQL注入問題之外還有問題,我們還需要看到'executeWriteSqlQuery'和'laggtillmall'來回答它。 – Hogan 2012-07-21 10:25:45

回答

1

我想你問的是訪問數據庫的更好方法。您應該查看Linq-To-SQLEntity Framework的初學者。這些技術在處理數據存儲方面提供了更現代且更易於使用的方法。

+1

我不同意,參數化查詢,Linq-To-SQL和Entity框架都可以被濫用和優雅地使用。實際上,新用戶往往會被新用戶濫用,因爲這些缺陷和問題還沒有完整記錄。在過去的幾年裏,我看到許多可怕的Entity框架解決方案。 – Hogan 2012-07-21 15:23:58

+0

嘿,布拉德!那正是我期待的!非常感謝我提高了你的答案!並將其標記爲答案! – 8bitcat 2012-07-21 21:00:23

+0

@霍根,如此真實!可惜很多人還是不明白,那個更新或更容易並不一定意味着更好... – walther 2012-07-22 08:35:23

4

好吧,讓我看看....

  • 你無法從DAL分離業務邏輯,這是一個非常不錯的辦法。數據訪問應該位於一個完全獨立的層,它不屬於Web服務。

  • 您的代碼非常容易受到SQL注入攻擊https://www.owasp.org/index.php/SQL_Injection。相反,您應該使用參數化查詢 http://www.techrepublic.com/article/shorten-development-time-by-using-parameterized-queries-in-adonet/6093390 或存儲過程,具體取決於您的需要。

  • 你的命名約定不是很好......在.NET中,我們通常更喜歡使用camelCase,而不是「thisismysuppaduappamethod」,而你的變量名稱並不十分清晰。請記住,你不是爲機器編寫代碼,而是爲人們閱讀。代碼應該易於閱讀,任何查看代碼的人都必須立即明白,它的目的是什麼。我非常懷疑,你會立即看到字符串pro1,int pro2實際上意味着什麼,而不需要深入研究代碼,如果將來需要修改代碼,比如2-3年之後。

  • 我推薦使用英文而不是您的母語。如果你需要代碼的幫助(或者向你的團隊介紹一個新的同事),它通常被認爲是一種優秀的做法,因爲你不必解釋「這是什麼?」。

+0

謝謝!非常建設性的批評!但有一個問題,我應該如何解除DAL的業務登錄。對於我的登錄,我創建了一個存儲過程,然後返回一個int,然後確定用戶是否可以登錄。我應該只使用存儲過程並從代碼隱藏中調用它們?我認爲datafetching是一個web服務的工作? – 8bitcat 2012-07-21 18:51:41

+0

@CarlPalsson,有人會說你應該只使用存儲過程,但我不同意他們。我說的是,該webservice不是你的DAL的地方。你應該有單獨的課程,甚至更好的一個班級圖書館,你可以隨時換掉你需要的東西。低層不應該知道任何高於它們的東西。你創建了一些web服務,但你在代碼隱藏方面像常規方法那樣調用它,我完全困惑,你用這種方法解決了什麼問題。我在DAL體系結構中根本沒有看到任何邏輯,但如果EF解決了您的問題,那麼對您有好處! – walther 2012-07-22 08:45:46

相關問題