2011-06-16 32 views
0

我正在採取oop的第一步,現在我正在重建一個實踐項目,使它成爲n層和oo。我有一個查詢在我的數據層,內部連接三個表,並選擇行SubmissionId = x;業務層有一個服務對象,將該行返回到表示層,但是當我點擊演示文稿時,我遇到了一個障礙。我確信,只要在表示層上定義了一個未分配的數據層變量就可以了,但我不知道如何正確調用它。思考?下面的代碼:傳遞一個對象與選擇哪裏變量?

數據層 //這落在公共類SubmissionDatabaseService下//

public Submission GetSubmissionsByID() 
{ 


     string viewQuery = "SELECT Submission.SubmissionId, Customer.CustName, Customer.SicNaic, Customer.CustCity, Customer.CustAddress, Customer.CustState, Customer.CustZip, Broker.BroName, Broker.BroCity, Broker.BroAddress, Broker.BroState, Broker.BroZip, Broker.EntityType, Submission.Coverage, Submission.CurrentCoverage, Submission.PrimEx, Submission.Retention, Submission.EffectiveDate, Submission.Commission, Submission.Premium, Submission.Comments FROM Submission INNER JOIN Broker ON Broker.BroId = Submission.BroId INNER JOIN Customer ON Customer.CustId = Submission.CustId WHERE Submission.SubmissionId =" + x; 
     string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString; 
     SqlConnection conn = new SqlConnection(connectionString); 



     conn.Open(); 

     SqlCommand viewCmd = new SqlCommand(viewQuery, conn); 
     SqlDataReader dr = viewCmd.ExecuteReader(); 
     Submission tempSubmission = new Submission(); 

      tempSubmission.SubmissionId1 = dr.GetInt32(0); 
      tempSubmission._Cust.CustName1 = dr.GetString(1); 
      tempSubmission._Cust.SicNaic1 = dr.GetInt32(2); 
      tempSubmission._Cust.CustCity1 = dr.GetString(3); 
      tempSubmission._Cust.CustAddress1 = dr.GetString(4); 
      tempSubmission._Cust.CustState1 = dr.GetString(5); 
      tempSubmission._Cust.CustZip1 = dr.GetInt32(6); 
      tempSubmission._Bro.BroName1 = dr.GetString(7); 
      tempSubmission._Bro.BroCity1 = dr.GetString(8); 
      tempSubmission._Bro.BroAddress1 = dr.GetString(9); 
      tempSubmission._Bro.BroState1 = dr.GetString(8); 
      tempSubmission._Bro.BroZip1 = dr.GetInt32(11); 
      tempSubmission._Bro.Entity1 = dr.GetString(12); 
      tempSubmission._SubCov.Coverage1 = dr.GetInt32(13); 
      tempSubmission._SubCov.CurrentCoverage1 = dr.GetInt32(14); 
      tempSubmission._SubCov.PrimEx1 = dr.GetInt32(15); 
      tempSubmission._SubCov.Retention1 = dr.GetInt32(16); 
      tempSubmission._SubCov.EffectiveDate1 = dr.GetDateTime(17); 
      tempSubmission._SubCov.Commission1 = dr.GetInt32(18); 
      tempSubmission._SubCov.Premium1 = dr.GetInt32(19); 
      tempSubmission._SubCov.Comment1 = dr.GetString(20); 

      return tempSubmission; 
} 

業務邏輯層

public class SubmissionService 

{

public Submission getSubmissionByID() 
{ 
    SubmissionDatabaseService sds = new SubmissionDatabaseService(); 
    return sds.GetSubmissionsByID(); 
} 

}

表示層

protected void Page_Load(object sender, EventArgs e) 
{ 

    string x = Request.QueryString["SubmissionId"]; 


    Submission sub = SubmissionService.getSubmissionByID(x); //Here is where I throw an overload error 

回答

1

SubmissionService.getSubmissionByID()不帶參數。所以你不能通過x。像這樣在業務層中更改它的簽名。

public Submission getSubmissionByID(string x) 
{ 
    SubmissionDatabaseService sds = new SubmissionDatabaseService(); 
    return sds.GetSubmissionsByID(s); 
} 

,並在這樣

public Submission GetSubmissionsByID(string x) 
{ 


     string viewQuery = "SELECT Submission.SubmissionId, Customer.CustName, Customer.SicNaic, Customer.CustCity, Customer.CustAddress, Customer.CustState, Customer.CustZip, Broker.BroName, Broker.BroCity, Broker.BroAddress, Broker.BroState, Broker.BroZip, Broker.EntityType, Submission.Coverage, Submission.CurrentCoverage, Submission.PrimEx, Submission.Retention, Submission.EffectiveDate, Submission.Commission, Submission.Premium, Submission.Comments FROM Submission INNER JOIN Broker ON Broker.BroId = Submission.BroId INNER JOIN Customer ON Customer.CustId = Submission.CustId WHERE Submission.SubmissionId =" + x; 
     ... 
1

您getSubmissionByID不採取放慢參數,但你傳遞一個吧。您需要將您傳遞的ID發送給數據庫來執行查詢。

public Submission getSubmissionByID(string id) 
{ 
    SubmissionDatabaseService sds = new SubmissionDatabaseService(); 
    return sds.GetSubmissionsByID(id); 
} 

您還需要具有數據訪問權限,然後在查詢中使用該參數。 '+ x'不是最佳實踐。你應該使用查詢參數。

public Submission GetSubmissionsByID(string id) 
    { 
      string viewQuery = @"SELECT Submission.SubmissionId, Customer.CustName, Customer.SicNaic, Customer.CustCity, Customer.CustAddress, Customer.CustState, Customer.CustZip, Broker.BroName, Broker.BroCity, Broker.BroAddress, Broker.BroState, Broker.BroZip, Broker.EntityType, Submission.Coverage, Submission.CurrentCoverage, Submission.PrimEx, Submission.Retention, Submission.EffectiveDate, Submission.Commission, Submission.Premium, Submission.Comments 
    FROM Submission 
     INNER JOIN Broker ON Broker.BroId = Submission.BroId INNER JOIN Customer ON Customer.CustId = Submission.CustId 
    WHERE Submission.SubmissionId = @id"; 

      string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString; 
      SqlConnection conn = new SqlConnection(connectionString); 
    Conn.Open(); 
    SqlCommand viewCmd = new SqlCommand(viewQuery, conn); 
    var parameter = new SqlParameter("@id", SqlDbType.VarChar) 
    parameter.Value = id; 
    cmd.Parameters.Add(parameter); 

    // skip some stuff 
    } 
+0

是的,NerdFury是參數化的時間。我一直在一個人的訓練下,他喜歡在我掌握基礎知識之後等待學習參數。實際的項目將不會部署,所以不用擔心實際的危險,但我現在需要了解它。感謝徹底的例子。 – 2011-06-17 16:27:37

+0

@Brazos - 樂於助人。 – NerdFury 2011-06-17 18:51:30

1

你只需要聲明你的數據層方法的參數數據層:

public Submission GetSubmissionsByID() 

成爲

public Submission GetSubmissionsByID(string x) 

但是,這會使系統全面打開以進行SQL注入 在嘗試編寫嵌入C#(或其他語言)的SQL之前,請先閱讀有關參數化SQL語句的內容。

相關問題