2016-06-08 8 views
1

나는 미친 듯이 나를 몰고가는 오류가 발생했습니다. 용서하십시오, 나는 초심자이다, 그래서 나는 어리 석고 어리석은 무언가를 미리 놓쳐서 잃을지도 모른다.프로 시저 또는 함수에 제공되지 않은 매개 변수가 필요합니다. - 매개 변수가 저장 프로 시저에 있습니다. (내 생각에)

나는

오류가 계속 "프로 시저 또는 함수 'prcPersonalSelectedByPatientIdAppointmentSelect는'매개 변수 '@PatientNumber'제공되지 않았습니다 기대합니다."

'@PatientNumber'는 저장 프로 시저에 있지만 SQL에 대한 지식이 가장 좋지 않으므로 당황한 것입니다.

ASPX 코드

<asp:UpdatePanel ID="pnlUpdate" runat="server"> 
     <ContentTemplate> 
      <asp:Panel ID="pnlResults" runat="server" ScrollBars="Auto" > 
       <asp:GridView ID="gvAppointmentSearch" runat="server" Font-Names = "Arial" 
        Font-Size = "11pt" ForeColor = "#000000" 
        onselectedindexchanged="gvAppointmentSearch_SelectedIndexChanged" 
        AutoGenerateColumns = "false" DataKeyNames="PatientNumber" AllowPaging = "true" 
        OnPageIndexChanging = "OnPaging" PageSize = "10" Width = "100%" 
        HeaderStyle-BackColor = "#465c71" HeaderStyle-ForeColor = "#ffffff" 
        style="margin-bottom: 26px"> 

        <Columns> 
         <%--Creates a select button that appear at the start of the grid view--%> 
         <asp:TemplateField> 
          <ItemTemplate> 
           <asp:LinkButton Text="Select" ID="lnkSelect" runat="server" CommandName="Select" /> 
          </ItemTemplate> 
         </asp:TemplateField> 

         <asp:TemplateField HeaderText="Appointment Number" ItemStyle-Wrap="False"> 
          <ItemTemplate> 
           <%--This will be the first field to appear beside the select button--%> 
           <asp:Label ID="lblAppointmentNumber" Text='<%# Eval("AppointmentNumber") %>' runat="server" /> 
          </ItemTemplate> 
         </asp:TemplateField> 
          <%--Bound fields will place them in a specific order--%> 
          <asp:BoundField DataField = "AppointmentDate" HeaderText = "Appointment Date" DataFormatString="{0:d}" /> 
          <asp:BoundField DataField = "AppointmentTime" HeaderText = "Appointment Time" DataFormatString="{0:d}" /> 
          <asp:BoundField DataField = "Consultant" HeaderText="Referred By" ItemStyle-Wrap="False" /> 
          <asp:BoundField DataField = "ByAttendance" HeaderText="Attendance"/> 
        </Columns> 
       </asp:GridView> 
      </asp:Panel> 
     </ContentTemplate> 
    <Triggers> 
    <asp:AsyncPostBackTrigger ControlID="gvAppointmentSearch" /> 
    </Triggers> 
    </asp:UpdatePanel> 

C# 코드

절차 저장

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      //Populate dropdown if no record has been selected 
      String strConString = ConfigurationManager.ConnectionStrings["OepdSQLConnectionString"].ConnectionString; 
      SqlConnection conn = new SqlConnection(strConString); 
      conn.ConnectionString = strConString; 
      SqlCommand cmdInit = new SqlCommand(); 
      cmdInit.CommandText = "Select * from DropdownCounty"; 
      cmdInit.Connection = conn; 
      conn.Open(); 
      DataTable dtInit = new DataTable(); 
      dtInit.Load(cmdInit.ExecuteReader()); 
      conn.Close(); 
      dpdCounty.DataSource = dtInit; 
      dpdCounty.DataTextField = "County"; 
      dpdCounty.DataValueField = "CountyID"; 
      dpdCounty.DataBind(); 
      DataSet ds = new DataSet(); 
      ds = (DataSet)Session["DS"]; 
      this.DataBindSearch(); 

      try 
      { 
       //Fields that are required to be filled in if the information is avaliable 
       patientNumber.Text = ds.Tables[0].Rows[0]["PatientNumber"].ToString(); 
       txtHCNumber.Text = ds.Tables[0].Rows[0]["HC_Number"].ToString(); 
       //if (ds.Tables[0].Rows[0]["ConsentToDatabase"].ToString() != null) 
       //chkDBConsent.Checked = (bool)ds.Tables[0].Rows[0]["ConsentToDatabase"]; 

       if (ds.Tables[0].Rows[0]["ConsentGivenDate"].ToString() != "dd/mm/yyyy") 
       { 
        if (ds.Tables[0].Rows[0]["ConsentGivenDate"].ToString() != null && ds.Tables[0].Rows[0]["ConsentGivenDate"].ToString() != "") 
        { 
         ConsentGivenDate.Text = Convert.ToDateTime(ds.Tables[0].Rows[0]["ConsentGivenDate"].ToString()).ToShortDateString(); 
        } 
       } 
       IDnumberLegacy.Text = ds.Tables[0].Rows[0]["ID_Number_LegacyID"].ToString(); 
       if (ds.Tables[0].Rows[0]["Sex"] != DBNull.Value) 
       { 
        //Datasource is added only when values are being added to allow for alterations to be made 
        //Allows for records with older dropdown values no longer selectable to be visible 
        String strConnString = ConfigurationManager.ConnectionStrings["OepdSQLConnectionString"].ConnectionString; 
        SqlConnection con = new SqlConnection(strConnString); 
        con.ConnectionString = strConnString; 
        SqlCommand cmd = new SqlCommand(); 
        SqlCommand cmdPop = new SqlCommand(); 

        cmd.CommandText = "Select Sex from DropdownSex"; 

        cmd.Connection = con; 
        con.Open(); 
        DataTable dt = new DataTable(); 

        dt.Load(cmd.ExecuteReader()); 
        con.Close(); 

        //String builder to gather records that are currently active 
        StringBuilder currentid = new StringBuilder(); 

        for (int i = dt.Rows.Count - 1; i >= 0; i--) 
        { 
         DataRow dr = dt.Rows[i]; 

         currentid.AppendLine(string.Join(",", dr.ItemArray)); 
        } 

        //convert stringbuilder to string 
        var output = currentid.ToString(); 

        // Creates new StringReader instance from System.IO 
        using (StringReader reader = new StringReader(output)) 
        { 
         // Loop over the lines in the string. 
         int count = 0; 
         string line; 
         while ((line = reader.ReadLine()) != null) 
         { 
          count++; 

          if (line == (ds.Tables[0].Rows[0]["Sex"].ToString())) 
           cmdPop.CommandText = " Select * From DropdownSex"; 
         } 
        } 

        if (cmdPop.CommandText == "") 
         cmdPop.CommandText = " Select * From DropdownSex"; 

        cmdPop.Connection = con; 
        con.Open(); 
        DataTable dtValues = new DataTable(); 
        dtValues.Load(cmdPop.ExecuteReader()); 
        con.Close(); 
        dpdSex.DataSource = dtValues; 
        dpdSex.DataTextField = "Sex"; 
        dpdSex.DataValueField = "SexID"; 
        dpdSex.DataBind(); 
        dpdSex.SelectedValue = ds.Tables[0].Rows[0]["SexID"].ToString(); 
       } 
       txtPatientFirstName.Text = ds.Tables[0].Rows[0]["Forename"].ToString(); 
       txtPatientSurname.Text = ds.Tables[0].Rows[0]["Surname"].ToString(); 
       PatientMaiden.Text = ds.Tables[0].Rows[0]["MaidenName"].ToString(); 
       if (ds.Tables[0].Rows[0]["DateOfBirth"].ToString() != "dd/mm/yyyy") 
       { 
        if (ds.Tables[0].Rows[0]["DateOfBirth"].ToString() != null && ds.Tables[0].Rows[0]["DateOfBirth"].ToString() != "") 
        { 
         txtDateOfBirth.Text = Convert.ToDateTime(ds.Tables[0].Rows[0]["DateOfBirth"].ToString()).ToShortDateString(); 
        } 
       } 
       AddressLine1.Text = ds.Tables[0].Rows[0]["AddressLine1"].ToString(); 
       AddressLine2.Text = ds.Tables[0].Rows[0]["AddressLine2"].ToString(); 
       AddressLine3.Text = ds.Tables[0].Rows[0]["AddressLine3_TownCity"].ToString(); 
       AddressLine4.Text = ds.Tables[0].Rows[0]["AddressLine4_Region"].ToString(); 
       if (ds.Tables[0].Rows[0]["County"] != DBNull.Value) 
       { 
        //Datasource is added only when values are being added to allow for alterations to be made 
        //Allows for records with older dropdown values no longer selectable to be visible 
        String strConnString = ConfigurationManager.ConnectionStrings["OepdSQLConnectionString"].ConnectionString; 
        SqlConnection con = new SqlConnection(strConnString); 
        con.ConnectionString = strConnString; 
        SqlCommand cmd = new SqlCommand(); 
        SqlCommand cmdPop = new SqlCommand(); 
        cmd.CommandText = "Select County from DropdownCounty"; 

        cmd.Connection = con; 
        con.Open(); 
        DataTable dt = new DataTable(); 

        dt.Load(cmd.ExecuteReader()); 
        con.Close(); 

        //String builder to gather records that are currently active 
        StringBuilder currentid = new StringBuilder(); 

        for (int i = dt.Rows.Count - 1; i >= 0; i--) 
        { 
         DataRow dr = dt.Rows[i]; 

         currentid.AppendLine(string.Join(",", dr.ItemArray)); 
        } 

        //convert stringbuilder to string 
        var output = currentid.ToString(); 

        // Creates new StringReader instance from System.IO 
        using (StringReader reader = new StringReader(output)) 
        { 
         // Loop over the lines in the string. 
         int count = 0; 
         string line; 
         while ((line = reader.ReadLine()) != null) 
         { 
          count++; 

          if (line == (ds.Tables[0].Rows[0]["County"].ToString())) 
           cmdPop.CommandText = " Select * From DropdownCounty"; 
         } 
        } 

        if (cmdPop.CommandText == "") 
         cmdPop.CommandText = " Select * From DropdownCounty"; 

        cmdPop.Connection = con; 
        con.Open(); 
        DataTable dtValues = new DataTable(); 

        dtValues.Load(cmdPop.ExecuteReader()); 
        con.Close(); 
        dpdCounty.DataSource = dtValues; 
        dpdCounty.DataTextField = "County"; 
        dpdCounty.DataValueField = "CountyID"; 
        dpdCounty.DataBind(); 
        dpdCounty.SelectedValue = ds.Tables[0].Rows[0]["CountyID"].ToString(); 
       } 
       PostCode.Text = ds.Tables[0].Rows[0]["PostCode"].ToString(); 
       HomeTelNumber.Text = ds.Tables[0].Rows[0]["HomeTelNumber"].ToString(); 
       MobileTelNumber.Text = ds.Tables[0].Rows[0]["MobileTelNumber"].ToString(); 
       WorkTelNumber.Text = ds.Tables[0].Rows[0]["WorkTelNumber"].ToString(); 
       PatientEmail.Text = ds.Tables[0].Rows[0]["Email"].ToString(); 
       PatientNotes.Text = ds.Tables[0].Rows[0]["Notes"].ToString(); 
       //Sets the color of the text box depedning if a value has been entered 
       string hex = "#F0F8FF"; 
       if (txtDateOfBirth.Text != "dd/mm/yyyy") 
        txtDateOfBirth.ForeColor = System.Drawing.Color.Black; 
       else 
        txtDateOfBirth.BackColor = System.Drawing.ColorTranslator.FromHtml(hex); 

       if (ConsentGivenDate.Text != "dd/mm/yyyy") 
        ConsentGivenDate.ForeColor = System.Drawing.Color.Black; 
       else 
        ConsentGivenDate.BackColor = System.Drawing.ColorTranslator.FromHtml(hex); 
      } 

      //If the dataset is empty this is executed instead 
      catch (Exception fe) 
      { 
       lblErrors.Text = "New Record Successfully Started!"; 

       //calls the poup to display a notification 
       dvMsg.Visible = true; 
       lblMsg.Text = "" + lblErrors.Text; 
      } 
     } 
     //Not required as this label has been replaced with a popup, still used to store message that will be displayed 
     lblErrors.Visible = true; 
     //Load the initial data from the session once 
     //***Custom error messages below***// 
     //Used to pull error message if someone else has already updated the data first 
     if (Session["ex"] != null) 
     { 
      var msg = Session["ex"].ToString(); 
      //Message to be displayed 
      if (msg == "Error") 
       lblErrors.Text = "Update Failed! Someone has already made changes!"; 
      else 
       lblErrors.Text = "Unable to update HC Number!"; 

      //calls the popup to display a notification 
      dvMsg.Visible = true; 
      lblMsg.Text = "" + lblErrors.Text; 

      //required to prevent error message appearing everytime the page loads 
      Session["ex"] = null; 
     } 

     //As the page refreshes when a new record is added to allow the master page to display the new records details this is required to pull 
     //forward the success message to inform the user that the record has been added and the page has not just refreshed 
     if (Session["NewRecordAdded"] != null) 
     { 
      //Message to be displayed 
      lblErrors.Text = "Record Succesfully Added!"; 

      //calls the popup to display a notification 
      dvMsg.Visible = true; 
      lblMsg.Text = "" + lblErrors.Text; 

      //required to prevent error message appearing everytime the page loads 
      Session["NewRecordAdded"] = null; 
     } 

     //Error when trying to find record that does not exist 
     if (Session["FindRecordError"] != null) 
     { 
      string a = Session["FindRecordError"].ToString(); 
      //Message to be displayed 
      if (a == "Unable to locate") 
       lblErrors.Text = "Unable to find record!"; 
      else 
       lblErrors.Text = "Full HC Number required!"; 

      //calls the popup to display a notification 
      dvMsg.Visible = true; 
      lblMsg.Text = "" + lblErrors.Text; 

      //required to prevent error message appearing everytime the page loads 
      Session["FindRecordError"] = null; 
     } 

     if (Session["PersonalDeatilsSave"] != null) 
     { 
      //only if an update has occured 
      lblErrors.Text = "Save Successful!"; 

      //calls the popup to display a notification 
      dvMsg.Visible = true; 
      lblMsg.Text = "" + lblErrors.Text; 

      //required to prevent error message appearing everytime the page loads 
      Session["PersonalDeatilsSave"] = null; 
     } 
    } 

    protected void gvAppointmentSearch_SelectedIndexChanged(object sender, EventArgs e) 
    { 

     DataSet ds = new DataSet(); 
     int index = gvAppointmentSearch.SelectedIndex; 

     string strConString = ConfigurationManager.ConnectionStrings["OepdSQLConnectionString"].ConnectionString; 
     SqlConnection myConnect = new SqlConnection(strConString); 
     myConnect.ConnectionString = strConString; 

     string strCommandText = "prcPersonalSelectedByPatientIdAppointmentRetrieve"; 

     try 
     { 
      SqlCommand sqlCmd = new SqlCommand(strCommandText, myConnect); 
      sqlCmd.CommandType = CommandType.StoredProcedure; 

      sqlCmd.Parameters.Add(new SqlParameter("@PatientNumber", gvAppointmentSearch.DataKeys[index].Value.ToString())); 

      SqlDataAdapter da = new SqlDataAdapter(); 
      da.SelectCommand = sqlCmd; 
      da.Fill(ds, "personal"); 

      //Needed to reset the clinical eval page for newly selected patient 
      Session["NDS"] = null; 
     } 

     catch (Exception fe) 
     { 
      lblMoreErrors.Text = "Error: " + fe.Message; 
     } 

     try 
     { 
      //Assigns the selected patients details to the dataset and redirects the user to the personal page 
      Session["DS"] = ds; 
      Response.Redirect("~/UserPages/PatientAppointment.aspx"); 
     } 

     catch (Exception er) 
     { 
      lblErrors.Text = "Error: " + er.Message; 
     } 
    } 

    //Tells the gridview what to do when the page change is selected 
    protected void OnPaging(object sender, GridViewPageEventArgs e) 
    { 
     this.DataBindSearch(); 
     gvAppointmentSearch.PageIndex = e.NewPageIndex; 
     gvAppointmentSearch.DataBind(); 
    } 

    protected void DataBindSearch() 
    { 

     DataSet ds = new DataSet(); 
     string strConString = ConfigurationManager.ConnectionStrings["OepdSQLConnectionString"].ConnectionString; 
     SqlConnection myConnect = new SqlConnection(strConString); 
     myConnect.ConnectionString = strConString; 
     string strCommandText = "prcPersonalSelectedByPatientIdAppointmentSelect"; 

     try 
     { 
      SqlCommand sqlCmd = new SqlCommand(strCommandText, myConnect); 
      sqlCmd.CommandType = CommandType.StoredProcedure; 
      SqlDataAdapter da = new SqlDataAdapter(); 
      da.SelectCommand = sqlCmd; 
      da.Fill(ds, "personal"); 

      gvAppointmentSearch.DataSource = ds; 
      //Finally, all results matching the criteria will be placed into the gridview 
      gvAppointmentSearch.DataBind(); 
      DataTable dt = new DataTable(); 
      da.Fill(dt); 
      Session["CurrentData"] = dt; 
      //Counts the number of results found 
      lblResults.Text = "Results Found: " + ds.Tables.Cast<DataTable>().Sum(x => x.Rows.Count).ToString(); 
     } 

     catch (Exception fe) 
     { 
      lblErrors.Text = "Error: " + fe.Message; 
     } 
    } 

    } 

SQL

ALTER PROCEDURE [dbo].[prcPersonalSelectedByPatientIdAppointmentSelect] @PatientNumber int AS SELECT [dbo].[Appointments].[AppointmentDate] as AppointmentDate ,dbo.Appointments.AppointmentTime as AppointmentTime ,[dbo].[DropdownReferredBy].[ReferredBy] as Consultant ,[dbo].[DropdownAttended].[ByAttendance] as ByAttendance ,dbo.Appointments.AppointmentNumber as AppointmentNumber FROM [dbo].[PATIENTS] LEFT JOIN dbo.Appointments on dbo.PATIENTS.PatientNumber = dbo.Appointments.PatientNumber LEFT JOIN [dbo].[DropdownReferredBy] on dbo.Appointments.ReferredBy = [dbo].[DropdownReferredBy].ReferredBy LEFT JOIN [dbo].[DropdownAttended] on dbo.Appointments.ByAttendance = dbo.DropdownAttended.ByAttendance WHERE dbo.PATIENTS.PatientNumber LIKE @PatientNumber ORDER BY AppointmentNumber ASC; 

이 모두에 추가하려면이 페이지는 연결 저장 프로 시저를 사용하여 다른 gridview의 데이터를 가져옵니다.

미리 감사드립니다. 내가 매우 바보 같은 짓을 한 경우 미안 해요 !!!

답변

2

DataBindSearch() 메서드에서 @PatientNumber 매개 변수의 값을 제공하지 않습니다. 해당 매개 변수를 지정하고 코드에서 더 이상 수행 할 필요가없는 값을 지정해야합니다.

또한주의를 기울이면서 실제로 SqlConnection 및 SqlCommand 개체를 using 문에 넣어야합니다.

protected void DataBindSearch() 
{ 
    DataSet ds = new DataSet(); 
    string strConString = ConfigurationManager.ConnectionStrings["OepdSQLConnectionString"].ConnectionString; 
    string strCommandText = "prcPersonalSelectedByPatientIdAppointmentSelect"; 

    using (SqlConnection myConnect = new SqlConnection(strConString)) 
    using (SqlCommand sqlCmd = new SqlCommand(strCommandText, connect)) 
    { 
     try 
     { 
      SqlCommand sqlCmd = new SqlCommand(strCommandText, myConnect); 
      sqlCmd.CommandType = CommandType.StoredProcedure; 

      //You need to add the parameter before you call da.Fill() 
      sqlCmd.Parameters.Add(new SqlParameter("@PatientNumber", /*Parameter Value*/)); 

      SqlDataAdapter da = new SqlDataAdapter(); 
      da.SelectCommand = sqlCmd; 
      da.Fill(ds, "personal"); 

      gvAppointmentSearch.DataSource = ds; 
      //Finally, all results matching the criteria will be placed into the gridview 
      gvAppointmentSearch.DataBind(); 
      DataTable dt = new DataTable(); 
      da.Fill(dt); 
      Session["CurrentData"] = dt; 
      //Counts the number of results found 
      lblResults.Text = "Results Found: " + ds.Tables.Cast<DataTable>().Sum(x => x.Rows.Count).ToString(); 
     } 

     catch (Exception fe) 
     { 
      lblErrors.Text = "Error: " + fe.Message; 
     } 
    } 
} 
+0

안녕 @Hill 덕분에 귀하의 답변 - 그러나 - 내가 sqlCmd.Parameters.Add에서 오류를 받고 있어요 (새 SqlParameter에 ("@ PatientNumber"gvAppointmentSearch.DataKeys [인덱스] .Value.ToString())); 그 말은 "이름 '색인'이 현재 상황에 존재하지 않는다는 것" – karlb123

+0

@ karlb123 내 잘못, 나는 내 대답을 편집했다. 'PatientNumber'를 – Hill

+0

으로 바꾸고 싶습니다. SQL에서 데이터를 호출하여 페이지로드시 gridview를 작성하는 것과 같은 원래 응답이 정확하다고 생각합니다. 그러나 그 불행히도 작동하지 않습니다 – karlb123

관련 문제