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>
당신은 당신의 코드를 단계별로,'않습니다 var status'는 실제 값으로 돌아옵니다. –
예. 문자열 값이 지정됩니다. – Andrew
어둠 속에서 쐈다. 그러나 테이블에서 상태가 'int'라고 가정하면 'dd'에서 가져올 때 Int32로 캐스팅 해보십시오. 나는 '상태'에 대한 'UpdateParameters.Add'메소드에서 'int'라고 가정합니다. 나는 이것이 문제가 될 것이라고 생각하지 않을 것입니다. 왜냐하면 당신은 var로 가지고 있기 때문에 그것을 확신 할 수 있습니다. –