2013-02-05 4 views
5

이 질문 유형은 적어도 12 번 이상 요구되었지만 이전 질문과 대답을 모두 찾아 보았습니다. 신청서를 찾았습니다. 내 페이지에서 여러 FormView 개체를 사용하고 있으며 이제 해당 옵션 중 하나를 편집하는 옵션을 추가하려고합니다. FormView는 저장 프로 시저에 링크의 SqlDataSource 채워, 그래서 레코드를 업데이트하는 저장 프로 시저를 만들어 지금처럼 보이는 SqlDataSource와,에 추가됩니다프로 시저 또는 함수 'xyz'에 지정된 인수가 너무 많습니다.

<asp:SqlDataSource ID="TestSqlDataSource" runat="server" 
        SelectCommandType="StoredProcedure" 
        ConnectionString="<%$ ConnectionStrings:development %>" 
        SelectCommand="usp_GetNewTestDetails" 
        UpdateCommand="usp_UpdateTest" 
        UpdateCommandType="StoredProcedure" 
        onupdating="TestSqlDataSource_Updating"> 
    <SelectParameters> 
     <asp:SessionParameter SessionField="TestID" Name="TestID"/> 
    </SelectParameters> 
    <UpdateParameters> 
     <asp:Parameter Name="testId" Type="Int32"/> 
     <asp:Parameter Name="testerLicense" Type="Int32" /> 
     <asp:Parameter Name="premiseOwner" Type="String" /> 
     <asp:Parameter Name="premiseAddress" Type="String" /> 
     <asp:Parameter Name="premiseCity" Type="String" /> 
     <asp:Parameter Name="premiseState" Type="String" /> 
     <asp:Parameter Name="premiseZip" Type="String" /> 
     <asp:Parameter Name="protectionType" Type="String" /> 
     <asp:Parameter Name="testType" Type="String" /> 
     <asp:Parameter Name="repairs" Type="String" /> 
     <asp:Parameter Name="notes" Type="String" /> 
     <asp:Parameter Name="testDate" Type="DateTime" /> 
     <asp:Parameter Name="employerName" Type="String" /> 
     <asp:Parameter Name="employerAddress" Type="String" /> 
     <asp:Parameter Name="phoneNumber" Type="String" /> 
     <asp:Parameter Name="emailAddress" Type="String" /> 
     <asp:Parameter Name="dataEntryName" Type="String" /> 
     <asp:Parameter Name="dataEntryPhone" Type="String" /> 
     <asp:Parameter Name="signature" Type="String" /> 
     <asp:Parameter Name="entryDate" Type="DateTime" /> 
    </UpdateParameters> 
</asp:SqlDataSource> 

나는 레코드를 업데이트하려고, 내 검색어에 너무 많은 매개 변수가 있다는 오류가 표시됩니다. 나는 트리플에서 내 코드의 매개 변수가 내 저장 프로 시저의 매개 변수와 정확히 일치하는지 (이름, 번호 및 순서)를 확인했다.

대답을 찾으려고 시도 할 때 this site (원본이 다운 된 것으로 보였으므로 archive.org로 이동해야 함)이라고 표시된 this post을 발견했습니다. trace 함수에 매개 변수를 추가하기 위해 제안한 내용을 적용했습니다. 내가 찾은 것은 저장 프로 시저에서 select 프로 시저의 업데이트 절차에없는 몇 가지 "조회"값이 있다는 것입니다. 필자가 업데이트하려고하는 테이블은 테스터의 ID 만 가지고 있지만 사용자가 이름을보고 싶어하므로 테이블을 참조하지만 FormView에서 해당 필드는 편집 모드에서 읽기 전용이므로 수행 할 수 있습니다. 그것을 바꾸려고하지 마라. 다른 모든 매개 변수는 정렬됩니다 ... 해당 조회 값만 해제됩니다.

필자는 매개 변수의 특정 목록을 포함하여 해당 매개 변수 만 사용 하겠지만 잘못된 것으로 보인다고 생각했습니다. 이제는 매개 변수를 이미 지정했기 때문에 난처한 상황에 처하게되고 선택 저장 프로 시저의 매개 변수로 덮어 쓰지 않는 곳을 볼 수 없습니다. 읽기 전용 값을 사용하지 말라고 어디에서 말합니까?

사용자가 필요하기 때문에 원래 저장 프로 시저에서 제거하지 않으려합니다. 지금까지 나와있는 한 가지 해결 방법은 저장 프로 시저에 추가 한 다음 사용하지 않는 것입니다. 이 방법이 효과가있을 것이라고 확신 할지라도 문제를 해결하는 것이 아니라 문제를 해결하는 것입니다.


EDIT : 추가 코드, 이것은 trace 함수에 파라미터를 출력하는 방법으로 요청

당 :

protected void TestSqlDataSource_Updating(object sender, SqlDataSourceCommandEventArgs e) 
{ 
    for (int i = 0; i < e.Command.Parameters.Count; i++) 
    { 
     Trace.Write(e.Command.Parameters[i].ParameterName); 
     if (e.Command.Parameters[i].Value != null) 
     { 
      Trace.Write(e.Command.Parameters[i].Value.ToString()); 
     } 
    } 
} 

이 사용되는 저장 절차는 업데이트 중 :

ALTER PROCEDURE [dbo].[usp_UpdateTest] 
    @testId INT , 
    @testerLicense INT , 
    @premiseOwner VARCHAR(50) , 
    @premiseAddress VARCHAR(150) , 
    @premiseCity VARCHAR(50) , 
    @premiseState VARCHAR(2) , 
    @premiseZip VARCHAR(10) , 
    @protectionType VARCHAR(11) , 
    @testType VARCHAR(2) , 
    @repairs VARCHAR(200) , 
    @notes VARCHAR(300) , 
    @testDate DATETIME , 
    @employerName VARCHAR(50) , 
    @employerAddress VARCHAR(150) , 
    @phoneNumber VARCHAR(25) , 
    @emailAddress VARCHAR(60) , 
    @dataEntryName VARCHAR(50) , 
    @dataEntryPhone VARCHAR(25) , 
    @signature VARCHAR(50) , 
    @entryDate DATETIME 
AS 
    BEGIN 
     SET NOCOUNT ON; 

     UPDATE dbo.Tests 
     SET  TesterLicense = @testerLicense , 
       PremiseOwner = @premiseOwner , 
       PremiseAddress = @premiseAddress , 
       PremiseCity = @premiseCity , 
       PremiseState = @premiseState , 
       PremiseZip = @premiseZip , 
       ProtectionType = @protectionType , 
       TestType = @testType , 
       Repairs = @repairs , 
       Notes = @notes , 
       TestDate = @testDate , 
       EmployerName = @employerName , 
       EmployerAddress = @employerAddress , 
       PhoneNumber = @phoneNumber , 
       EmailAddress = @emailAddress , 
       DataEntryName = @dataEntryName , 
       DataEntryPhone = @dataEntryPhone , 
       Signature = @signature , 
       EntryDate = @entryDate 
     WHERE TestID = @testId 
    END 
+0

맞춤법 오류나 데이터 유형 변환 오류가 있는지 확인 했습니까? –

+0

@RuchiRahulDoshi 예. 두 매개 변수 집합을 Excel로 복사 한 다음 줄 단위로 비교했습니다. 이 질문은 여기에있는 일반적인 질문에서 가장 일반적인 문제 였으므로 정확한지 확실히하기 위해 매우 신중했습니다. 전달하는 모든 매개 변수를 표시하는 데'trace '를 사용했기 때문에 실제로 너무 많은 인수를 전달하고 있는지 확인할 수 있지만 해제하는 방법을 모르겠습니다. – techturtle

+0

마음에 들지 않으면 "usp_UpdateTest"및 "TestSqlDataSource_Updating"을 여기에 붙여주십시오. –

답변

6

혼자서 알아 냈습니다. Visual Studio에서 저장 프로 시저의 스키마를 기반으로 나를 위해 템플릿을 만들었던 것과 관련이 있습니다. 템플릿이 자동 생성되면, <EditItemTemplate> 섹션의 모든 텍스트 상자는 다음과 같이 생성됩니다 :

<asp:TextBox ID="TestIDTextBox" runat="server" Text='<%# Bind("TestID") %>'/> 

는이 원인이 된 Bind 문임을 밝혀졌습니다. VS는 Bind을 사용하여 채워진 모든 필드에 대한 매개 변수를 자동으로 만듭니다. <UpdateParameters> 섹션이이 섹션을 재정의해야한다고 생각하게되었지만 실제로는 다른 방법이었습니다.나는 Bind에서 Eval에 해당 필드에 코드를 변경하여 매개 변수를 다시 통과 이러한 몇 가지 읽기 전용 필드를 방지 할 수 있었다 :

<asp:TextBox ID="TestIDTextBox" runat="server" Text='<%# Eval("TestID") %>'/> 

작품 완벽 지금.


부록이뿐만 아니라, 다른 방향에서 동일한 문제를 일으키는

알았다. 편집하려는 필드를 Eval으로 표시하고 싶지 않지만 행 ID와 같이 업데이트에 포함해야하는 필드는 표시되지 않습니다. 이번에는 너무 적은 수의 매개 변수에 대해서는 작동하지 않습니다. 지금은 <UpdateParameters> 섹션의 목적이 무엇 인지도 궁금합니다. 아무 것도 따르지 않기 때문에 궁금합니다.

+0

당신의 해결책을 시도하고, Bind with Eval을 대체했습니다. 그것은 나에게 '프로 시저 또는 함수'xyz '더 이상 지정된 인수가 더 이상 있지만 데이터가 업데이 트되지 않습니다 오류를주지 않습니다 –

+0

@ ThandoTee 당신은 * 모든 *'Bind' 문을'Eval'로 대체하고 싶지 않습니다, 데이터를 업데이트하지 않는 소수의 사용자 만 사용할 수 있습니다. 'Eval'은 읽기 전용 명령이므로 해당 필드를 업데이트하지 않습니다. – techturtle

+0

함께 나왔던 솔루션을 게시 해 주셔서 감사합니다. 나는 ASP 프로그래머가 아니지만 SQL Server가 오류를 일으킬 때 다른 사람들을 도울 수 있습니다. –

1

예를 들어 OnDeleting 이벤트 (e.Command.Parameters.RemoveAt) 중에 원하지 않는 매개 변수를 삭제할 수 있습니다. (나는)).

관련 문제