2013-02-05 43 views
5

Tôi biết loại câu hỏi này đã được hỏi ít nhất một chục lần trên SO, nhưng tôi đã trải qua tất cả các câu hỏi và câu trả lời trước đây mà tôi có thể tìm thấy ở đây Tôi đã tìm thấy áp dụng. Tôi đang sử dụng một số đối tượng FormView trên trang của tôi và bây giờ muốn thêm tùy chọn để chỉnh sửa một trong số chúng. FormView được phổ biến bởi SqlDataSource liên kết với một thủ tục lưu trữ, vì vậy tôi làm một thủ tục lưu trữ để cập nhật các hồ sơ và bổ sung nó vào SqlDataSource, mà bây giờ trông như thế này:Thủ tục hoặc chức năng 'xyz' có quá nhiều đối số được chỉ định

<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> 

Khi tôi cố gắng để cập nhật một kỷ lục, Tôi nhận được thông báo lỗi có quá nhiều tham số trong truy vấn của tôi. Tôi đã kiểm tra ba lần rằng các tham số trong mã của tôi khớp chính xác (tên, số, và thậm chí cả thứ tự) với các tham số trong thủ tục lưu sẵn của tôi.

Khi cố gắng tìm câu trả lời, tôi đã xem qua số this post tham chiếu this site (phải chuyển đến archive.org vì bản gốc dường như bị gỡ xuống). Tôi đã áp dụng những gì họ đã đề xuất để thêm tham số vào hàm trace. Những gì tôi thấy là trong thủ tục lưu trữ của tôi, có một vài "tra cứu" giá trị từ các thủ tục chọn mà không phải là trong các thủ tục cập nhật. Bảng tôi đang cố gắng cập nhật chỉ có ID của trình kiểm tra, nhưng người dùng cũng muốn xem tên của họ, vì vậy nó tham chiếu đến bảng đó, nhưng trong FormView, các trường đó chỉ đọc trong chế độ chỉnh sửa để chúng có thể không cố thay đổi nó. Tất cả các tham số khác xếp hàng ... chỉ những giá trị tra cứu đó bị tắt.

Tôi nghĩ rằng bằng cách bao gồm danh sách thông số cụ thể để vượt qua nó sẽ chỉ sử dụng các thông số đó, nhưng điều đó có vẻ không chính xác. Bây giờ tôi stumped bởi vì tôi đã chỉ định các tham số, và tôi không thể nhìn thấy bất cứ nơi nào mà họ đang được ghi đè với những người từ các thủ tục được lưu trữ chọn. Tôi không được phép sử dụng những giá trị chỉ đọc ở đâu?

Tôi không muốn xóa chúng khỏi quy trình được lưu trữ ban đầu vì chúng sẽ cần thiết cho người dùng. Một cách giải quyết mà tôi đã đưa ra cho đến nay là thêm chúng vào các thủ tục được lưu trữ và sau đó chỉ không bao giờ sử dụng chúng. Mặc dù tôi khá chắc chắn điều này sẽ làm việc, nó là rất nhiều chỉ che đậy vấn đề hơn là sửa chữa nó.


EDIT: đang bổ sung, theo yêu cầu

Đây là phương pháp mà kết quả đầu ra các thông số để các trace chức năng:

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()); 
     } 
    } 
} 

Đây là thủ tục lưu trữ được sử dụng để đang cập nhật:

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

Bạn có kiểm tra xem có bất kỳ lỗi chính tả hoặc lỗi chuyển đổi loại dữ liệu nào không? –

+0

@RuchiRahulDoshi Có. Tôi đã sao chép cả hai bộ tham số vào Excel và so sánh từng dòng. Đó là vấn đề phổ biến nhất trong câu hỏi quá phổ biến ở đây, vì vậy tôi đã rất cẩn thận để đảm bảo chúng chính xác. Đã sử dụng 'dấu vết' để hiển thị tất cả các tham số mà nó truyền đi, tôi có thể chắc chắn rằng nó thực sự truyền qua quá nhiều đối số, nhưng tôi không biết cách tắt nó đi. – techturtle

+0

Bạn vui lòng dán "usp_UpdateTest" và "TestSqlDataSource_Updating" vào đây nếu bạn không phiền. –

Trả lời

6

Đã tự mình tìm ra điều này. Nó liên quan đến thực tế là Visual Studio tạo ra các mẫu cho tôi dựa trên lược đồ của thủ tục lưu sẵn. Khi mẫu được autogenerated, mỗi hộp trong phần <EditItemTemplate> được tạo ra như thế này:

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

Hóa ra rằng đó là Bind tuyên bố rằng gây ra điều này. VS tự động tạo tham số cho bất kỳ trường nào được điền bằng cách sử dụng Bind. Mặc dù tôi đã được dẫn đến tin rằng phần <UpdateParameters> nên đã ghi đè điều này, nó đã thực sự là cách khác xung quanh.Tôi đã có thể để ngăn chặn những vài lĩnh vực chỉ đọc từ qua lại các thông số của họ bằng cách thay đổi mã trên những lĩnh vực Bind-Eval:

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

trình hoàn hảo bây giờ.


Phụ Lục:

Tìm thấy rằng điều này gây ra cùng một vấn đề theo một hướng khác là tốt. Nếu bạn đánh dấu một trường mà bạn không muốn chỉnh sửa là Eval nhưng nó cần phải được bao gồm trong bản cập nhật (chẳng hạn như ID hàng) thì trường này sẽ không hoạt động, lần này cho quá ít tham số. Bây giờ tôi tự hỏi mục đích của phần <UpdateParameters> là gì, vì nó dường như không theo bất cứ thứ gì trong đó ...

+0

Tôi đã thử giải pháp của bạn, thay thế Bind bằng Eval. Nó không cung cấp cho tôi lỗi 'Thủ tục hoặc hàm' xyz 'có quá nhiều đối số được chỉ định' nữa nhưng dữ liệu không được cập nhật –

+0

@ThandoTee Bạn không muốn thay thế * tất cả * câu lệnh 'Bind' bằng' Eval', chỉ một số ít không được phép cập nhật dữ liệu. 'Eval' là lệnh chỉ đọc, vì vậy nó sẽ không cập nhật các trường đó. – techturtle

+0

Cảm ơn bạn đã đăng giải pháp mà bạn đã đưa ra. Tôi không phải là một lập trình ASP nhưng nó sẽ cho phép tôi để giúp đỡ người khác khi SQL Server ho lên sucn một lỗi. –

1

Bạn có thể xóa các tham số không mong muốn trong ví dụ sự kiện OnDeleting (e.Command.Parameters.RemoveAt) (tôi)).

Các vấn đề liên quan