передать объект с переменной выбора где? - PullRequest
0 голосов
/ 16 июня 2011

Я делаю свои первые шаги в 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

Ответы [ 3 ]

1 голос
/ 16 июня 2011

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 голос
/ 16 июня 2011

Вам просто нужно объявить параметр метода уровня данных:

public Submission GetSubmissionsByID()

становится

public Submission GetSubmissionsByID(string x)

ОДНАКО, это делает вашу систему широко открытой для SQL-инъекций Прочитайте о параметризованных операторах SQL, прежде чем пытаться писать SQL, встроенный в C # (или другой язык)

1 голос
/ 16 июня 2011

Ваш getSubmissionByID не принимает параметр, но вы передаете его ему. Вам нужно взять идентификатор, который вы передаете, чтобы дать базе данных для выполнения запроса.

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

Вам также нужно, чтобы доступ к данным принимал параметр, а затем использовал этот параметр в своем запросе. «+ Х» не лучшая практика. Вы должны использовать параметры запроса.

    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
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...