2013-07-03 4 views
1

GridView의 업데이트 단추를 선택할 때 저장 프로 시저를 호출 할 수 있도록 UpdateCommand를 추가하려고하는 SqlDataSource가 있습니다. 나는 레코드가 데이터베이스 테이블에 이미 존재하는지 (INSERT for new, 기존 레코드에 대한 UPDATE)에 따라 두 개의 프로 시저 중 하나를 호출해야한다는 사실 때문에 코드에서이 작업을 수행하고 있습니다. 나는의 RowUpdating 이벤트에 Updateparameters을 설정하면, 다음과 같은 예외가 :SqlDataSource 프로 시저 또는 함수에 지정된 매개 변수가 필요하지 않습니다.

절차 또는 함수 'usp_TestLogInsert'이 제공되지 않았습니다 매개 변수 '@status'를 기대하고있다.

여기에 ASP 코드와 코드가 있습니다. 명시 적으로 코드의 매개 변수를 생성하고 있으므로이 예외가 나타나는 이유를 알 수 없습니다. 저장 프로 시저에 필요한 매개 변수가 동일한 지 확인했습니다.

C#을

protected void gvChecklist_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    SQLConnections sql = new SQLConnections(); 
    SqlDataSource dsChecklist = (SqlDataSource)LoginView1.FindControl("dsChecklist"); 
    var dd = (DropDownList)gvChecklist.Rows[e.RowIndex].FindControl("ddStatus"); 
    var status = dd.SelectedValue; 
    var testID = sql.SQLSelectSingle(String.Format("SELECT ID FROM Automation.manual.Tests WHERE Task = '{0}'", (String)e.OldValues["Task"]), "pwautosql01"); 
    string user = Page.User.Identity.Name; 
    string notes = (String)e.NewValues["Notes"]; 
    string jira = (String)e.NewValues["JiraTicket"]; 
    var dbID = e.NewValues["ID"]; 
    string build = "TODO"; 

    if (dbID == null) //Record does not exist in TestLog, INSERT a new one 
    { 
     dsChecklist.UpdateCommand = "[Automation].[manual].[usp_TestLogInsert]"; 
     dsChecklist.UpdateCommandType = SqlDataSourceCommandType.StoredProcedure; 
     dsChecklist.UpdateParameters.Add("@Status", TypeCode.Int32, status); 
     dsChecklist.UpdateParameters.Add("@TestID", TypeCode.Int32, testID); 
     dsChecklist.UpdateParameters.Add("@TestedBy", TypeCode.String, user); 
     dsChecklist.UpdateParameters.Add("@Notes", TypeCode.String, notes); 
     dsChecklist.UpdateParameters.Add("@JiraTicket", TypeCode.String, jira); 
     dsChecklist.UpdateParameters.Add("@Build", TypeCode.String, build); 

     dsChecklist.Update(); 
    } 
    //else //Record already exists in TestLog. UPDATE 
    //{ 
     //TODO 
    //} 
} 

ASP

  <asp:UpdatePanel ID="upGridView" runat="server" UpdateMode="Conditional"> 
      <ContentTemplate> 
      <asp:GridView ID="gvChecklist" runat="server" 
        AutoGenerateColumns="false" DataSourceID="dsChecklist" 
        AutoGenerateEditButton="true" onrowupdating="gvChecklist_RowUpdating"> 
       <Columns> 
        <asp:TemplateField HeaderText="Status"> 
         <ItemTemplate> 
          <asp:Label ID="lblStatus" runat="server" Text='<%#Eval("Status") %>' /> 
         </ItemTemplate> 
         <EditItemTemplate> 
          <asp:DropDownList ID="ddStatus" runat="server" DataTextField="Status" DataValueField="ID" DataSourceID="dsStatus" /> 
         </EditItemTemplate> 
        </asp:TemplateField> 
        <asp:BoundField DataField="Division" 
          HeaderText="Division" 
          readonly="true" /> 
        <asp:BoundField DataField="Application" 
          HeaderText="Application" 
          readonly="true" /> 
        <asp:BoundField DataField="Task" 
          HeaderText="Task" 
          readonly="true" /> 
        <asp:BoundField DataField="TestedBy" HeaderText="Tested By" readonly="true"/> 
        <asp:BoundField DataField="Notes" HeaderText="Notes" ReadOnly="false"/> 
        <asp:BoundField DataField="JiraTicket" 
          HeaderText="JIRA Ticket" 
          readonly="false" /> 
        <asp:BoundField DataField="ID" /> 
       </Columns> 
      </asp:GridView> 
      </ContentTemplate> 
      <Triggers> 
      <asp:PostBackTrigger ControlID="gvChecklist" /> 
     </Triggers> 
      </asp:UpdatePanel> 
      </td> 
     </tr> 
    </table> 

    <asp:SqlDataSource ID="dsChecklist" SelectCommand=" SELECT l.ID, d.division, c.Context AS Application, t.Task, l.TestedBy, l.Notes, l.JiraTicket, s.Status 
                 FROM Automation.manual.Tests t 
                 OUTER APPLY 
                  (SELECT TOP 1 * 
                  FROM Automation.manual.TestLog l 
                  WHERE l.TestID = t.ID 
                  ORDER BY l.Date DESC) l 
                 INNER JOIN Automation.dbo.Context c ON c.ID = t.Context 
                 INNER JOIN Automation.dbo.Division d ON d.ID = t.Division 
                 LEFT OUTER JOIN Automation.manual.Status s ON s.ID = l.Status" 
                 UpdateCommand="" 
         runat="server" 
         ConnectionString="<%$ ConnectionStrings:AutomationDBConnectionString %>" /> 

    <asp:SqlDataSource ID="dsStatus" SelectCommand="SELECT ID, Status FROM Automation.manual.Status"        
         runat="server" 
         ConnectionString="<%$ ConnectionStrings:AutomationDBConnectionString %>"> 
         </asp:SqlDataSource> 
+0

당신은 당신의 코드를 단계별로,'않습니다 var status'는 실제 값으로 돌아옵니다. –

+0

예. 문자열 값이 지정됩니다. – Andrew

+0

어둠 속에서 쐈다. 그러나 테이블에서 상태가 'int'라고 가정하면 'dd'에서 가져올 때 Int32로 캐스팅 해보십시오. 나는 '상태'에 대한 'UpdateParameters.Add'메소드에서 'int'라고 가정합니다. 나는 이것이 문제가 될 것이라고 생각하지 않을 것입니다. 왜냐하면 당신은 var로 가지고 있기 때문에 그것을 확신 할 수 있습니다. –

답변

3

당신은 매개 변수 이름 앞에 @을 떠날 필요는 SqlDataSource와 당신을 위해 추가합니다. 참조 here 또한

데이터 소스는 다음 뒤에 코드에서 그 값을 설정 인스턴스화 할 때 매개 변수를 추가하려고 :

<UpdateParameters> 
    <asp:Parameter Name="Status" Type="Int32" /> 
    <asp:Parameter Name="TestID" Type="Int32" /> 
    <asp:Parameter Name="TestedBy" Type="String" /> 
    <asp:Parameter Name="Notes"  Type="String" /> 
    <asp:Parameter Name="JiraTicket"  Type="String" /> 
    <asp:Parameter Name="Build" Type="String" /> 
</UpdateParameters> 

다음 :

if (dbID == null) //Record does not exist in TestLog, INSERT a new one 
{ 
    dsChecklist.UpdateCommand = "[Automation].[manual].[usp_TestLogInsert]"; 
    dsChecklist.UpdateCommandType = SqlDataSourceCommandType.StoredProcedure; 
    dsChecklist.UpdateParameters["@Status"].Value = status; 
    dsChecklist.UpdateParameters["@TestID"].Value = testID; 
    dsChecklist.UpdateParameters["@TestedBy"].Value = user; 
    dsChecklist.UpdateParameters["@Notes"].Value = notes; 
    dsChecklist.UpdateParameters["@JiraTicket"].Value = jira; 
    dsChecklist.UpdateParameters["@Build"].Value = build; 

    dsChecklist.Update(); 
} 
+0

이것이 작동하고 저장 프로 시저가 실행되면 데이터베이스 테이블의 값을 볼 수 있습니다. 그러나 이벤트가 종료되면 '프로 시저 또는 함수 usp_TestLogInsert에 인수가 너무 많이 지정되었습니다.'가 throw됩니다. – Andrew

+0

후속 호출의 매개 변수를 지우거나 값을 업데이트해야합니다. 아마도 여러 번 추가 할 것입니다. – SpaceghostAli

+0

'dsChecklist.UpdateParameters.Clear();를 호출하면 원래 문제가 다시 발생합니다. 매개 변수를 지우면 다시 추가되지 않습니다. – Andrew