Bu tür bir soruyu SO üzerinde en az bir düzine kez sordum, ancak burada bulabildiğim tüm önceki soruları ve yanıtları inceledim ve Başvuruyu buldum. Sayfamda birkaç FormView nesnesi kullanıyorum ve şimdi bunlardan birini düzenlemek için seçenek eklemek istiyorum. FormView bir saklı yordam bağlı SqlDataSource tarafından doldurulan, bu yüzden kayıtlarını güncellemek için saklı bir yordam yaptı ve şimdi şuna benzer SqlDataSource, bunu eklenir:'xyz' yordamının ya da işlevinin çok fazla argümanı var belirtildi
<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>
ben bir kaydı güncellemek girişiminde, Sorgumda çok fazla parametre olduğunu belirten bir hata alıyorum. Kodumdaki parametrelerin benim saklı yordamımdakilerle tam olarak eşleştiğini (ad, numara ve hatta sipariş) üç kez kontrol ettim. Yanıtları bulmaya çalışırken, this site numaralı başvuruya atıfta bulunan this post numaralı telefona rastladım (orjinali göründüğü için archive.org adresine gitmek zorunda kaldı). Parametreleri eklemek için önerdikleri şeyi trace
işlevine uyguladık. Bulduğum şey, benim saklı yordamımda, güncelleme yordamında olmayan seçme işleminden birkaç "arama" değeri bulunduğudur. Güncellemeye çalıştığım masa sadece test cihazının kimliğini taşıyor, ancak kullanıcılar isimlerini de görmek istiyorlar, bu yüzden tabloya başvuruyor, ancak FormView'da bu alanlar düzenleme modunda salt okunurlar. Onu değiştirmeye teşebbüs etme. Diğer tüm parametreler sıralanıyor ... sadece bu arama değerleri kapalı.
Bu parametreleri yalnızca bu parametreleri kullanacağını iletmek için belirli parametre listesini ekleyerek yanlış olduğunu düşündüm. Şimdi güvendim çünkü parametreleri zaten belirttim ve seçili saklı yordamlardan biriyle yazıldığını göremiyorum. Bu salt okunur değerleri kullanmamalarını nerede söyleyebilirim?
Kullanıcıların ihtiyaç duyacağı için bunları orijinal saklı yordamından kaldırmak istemiyorum. Şimdiye kadar geldiğim bir geçici çözüm, onları saklı yordama eklemektir ve sonra bunları asla kullanmaz. Her ne kadar bu işe yarayacak olsa da, sorunu düzeltmekten ziyade sorunu örtbas ediyor.
DÜZENLEME: ek kod Bu trace
işlev parametreleri çıktılar yöntemdir isteğe
başına:
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());
}
}
}
Bu kullanılan saklı işlemdir güncelleme:
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
Herhangi bir yazım hatası veya veri türü dönüştürme hatası olup olmadığını kontrol ettiniz mi? –
@RuchiRahulDoshi Evet. Her iki parametre kümesini de Excel'e kopyaladım ve karşılaştırarak satır satırına gittim. Bu çok yaygın olan soruda en yaygın sorun buydu, bu yüzden kesin olduklarından emin olmak için çok dikkatliydim. Geçirdiği tüm parametreleri görüntülemek için 'trace 'kullanmış olduğundan, aslında çok fazla argüman geçtiğinden emin olabilirim, ama nasıl kapatacağımı bilmiyorum. – techturtle
"Usp_UpdateTest" ve "TestSqlDataSource_Updating" öğelerinizi, eğer sakıncası yoksa buraya yapıştırır mısınız? –