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
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? –
@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
Bạn vui lòng dán "usp_UpdateTest" và "TestSqlDataSource_Updating" vào đây nếu bạn không phiền. –