Volanie ulozenej procedury   otázka

SQL

Zdravim, mam takyto problem

Mam jednoduchy SqlDataSource

<asp:SqlDataSource ID="sourcePrislusnik" runat="server" 
        ConnectionString="<%$ ConnectionStrings:PersonalConnectionString %>" 
        SelectCommand="GetPrislusnik" SelectCommandType="StoredProcedure" 
        UpdateCommand="UPDATE Prislusnici SET Meno = @Meno	WHERE (PrislusniciId = @PrislusniciId)	">
        <SelectParameters>
            <asp:QueryStringParameter Name="PrislusnikId" QueryStringField="Cislo" 
                Type="Int32" />
        </SelectParameters>
        <UpdateParameters>
            <asp:Parameter Name="Meno" Type="String" />
            <asp:Parameter Name="PrislusniciId" Type="Int32" />
        </UpdateParameters>
    </asp:SqlDataSource>

Ide mi o Update. Takto to vsetko bez problemov funguje.

Ale ked zmenim update do ulozenej procedury:

<asp:SqlDataSource ID="sourcePrislusnik" runat="server" 
        ConnectionString="<%$ ConnectionStrings:PersonalConnectionString %>" 
        SelectCommand="GetPrislusnik" SelectCommandType="StoredProcedure" 
        UpdateCommand="EditPrislusnik" UpdateCommandType="StoredProcedure" >
        <SelectParameters>
            <asp:QueryStringParameter Name="PrislusnikId" QueryStringField="Cislo" 
                Type="Int32" />
        </SelectParameters>
        <UpdateParameters>
            <asp:Parameter Name="Meno" Type="String" />
            <asp:Parameter Name="PrislusniciId" Type="Int32" />
        </UpdateParameters>
    </asp:SqlDataSource>

Tak to vyhodí chybu :

Procedure or function EditPrislusnik has too many arguments specified.

Pritom ulozena procedura ve podla mna OK

Tu je ta ulozena procedura

USE [Personal2]
GO
/****** Object:  StoredProcedure [dbo].[EditPrislusnik]    Script Date: 11/11/2010 13:17:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
ALTER PROCEDURE [dbo].[EditPrislusnik] 
	-- Add the parameters for the stored procedure here
	
	@Meno nvarchar(50),
	@PrislusniciId	int
AS
BEGIN
	UPDATE Prislusnici 
		SET Meno = @Meno
	WHERE (PrislusniciId = @PrislusniciId)	
END

Vobec netusim kde je problem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkuste si spustit na dané stránce trace a v kódu vypsat proměnné co posíláte jako parametry,pak uvidíte jestli vám sedí počet,typ,..

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mozete mi blizsie popisat ako to urobím.

Takze do SqlDataSource pre update pridám: onupdating="sourcePrislusnik_Updating"

co mat dat do kodu aby mi to vypísalo parametre ktore posielam do ulozenej procedury ?

Ked tam dam tento kod:

 protected void sourcePrislusnik_Updating(object sender, SqlDataSourceCommandEventArgs e)
    {
 int pocet = e.Command.Parameters.Count;
    }

tak mi to vyhodi ze tam mam 12 parametrov. Teda vsetky co su v tabulke Prislusnici a nie len tie dva co tam posielam v

....<UpdateParameters>
            <asp:Parameter Name="Meno" Type="String" />
            <asp:Parameter Name="PrislusniciId" Type="Int32" />
        </UpdateParameters>...

Dik

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A která komponenta tento SqlSource využívá? Nepoužíváte v té komponentě náhodou Expression Bind a Eval?Napadá mě jestli nemáte definováno Bind i tam kde není třeba,kde by stačilo eval.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Skontroloval som tentokrát aj UpdateParameters a je to OK. Sú tam len tie dva.

Ale je to cele cudne lebo nic som nemenil v nastavení parametrov SqlDataSource len som ten jednoduchý UpdateCommand supol do ulozenej procedury. A nastavil som UpdateCommand na tuto ulozenu proceduru.

Podla mna by to bez problemov malo ist ale nejde.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A kontroloval jste ty expression buildery?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Použivat tam FormView

PrislusniciId je Label Eval a ostane su TextBoxy a Bind.

Tu je kus kodu:

<asp:FormView ID="FormView1" runat="server" DataKeyNames="PrislusniciId" DataSourceID="sourcePrislusnik">
<EditItemTemplate>
 <hr />
 Číslo záznamu:
 <asp:Label ID="PrislusniciIdLabel" runat="server" Text='<%# Eval("PrislusniciId") %>' />
 Osobné číslo:
 <asp:TextBox ID="OsCisloTextBox" runat="server" Text='<%# Bind("OsCislo") %>' />
.....

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A nemělo by to být obráceně? Eval tam kde používáte pouze read-only a Bind tam kde používáte 2way databinding.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No ved tak to je.

Eval je na Labely a Bind na TextBox.

Ale neviem prečo riešime formView ten je OK.

Ked si ten SQL prikaz hodim priamo do kodu tak vsetko funguje. Ale ked ho len hodim do StoreProcedury a z kodu volam proceduru tak to prestane fungovat.

Toak ako som pisal hore.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pusťte si SQL Server Profiler a podívejte se, co do té databáze přesně posíláte.

Ve FormView musíte mít Bind jen dvakrát (jednou pro každý UpdateParameter), pokud je tam víckrát, tak to té proceduře pošle evidentně všechny parametry.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V tom to asi nebude.Já jsem zkoušel udělat simple stránku,kde je pouze FormView a příslušný SqlDataSource.Pro update mám definovanou Stored Proceduru s dvěma vstupnímy parametry.Ve FormView mám taky pouze dvě proměnné a stejně dostávám chyb.hlášku.Pokud spustim proceduru ručně i přes VS,tak je vše ok.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkoušel jsem to u sebe jak ve FR3.5,tak i ve FR4.0 a funguje mi to ok.

Nastaveno mám takto:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:Test_DB %>" 
            SelectCommand="SELECT * FROM [users]"            
            InsertCommand="InsertUser" InsertCommandType="StoredProcedure"
            UpdateCommand="UpdateUser" UpdateCommandType="StoredProcedure">
            <InsertParameters>
                <asp:Parameter Name="First_name" Type="String" />
                <asp:Parameter Name="Last_name" Type="String" />
            </InsertParameters>
            <UpdateParameters>
                <asp:Parameter Name="Id" Type="Int32" />
                <asp:Parameter Name="First_name" Type="String" />
                <asp:Parameter Name="Last_name" Type="String" />
            </UpdateParameters>
        </asp:SqlDataSource>

a stored procedura:

ALTER PROCEDURE dbo.UpdateUser
	(
	@Id int,
	@First_name nvarchar(50),
	@Last_name nvarchar(50)
	)
AS

BEGIN
	UPDATE users 
		SET First_name = @First_name,Last_name = @Last_name
	WHERE Id = @Id	
END

Ale také bych řekl,že budete mít ve formu více Bind než-li je třeba a tak je poté předáváno více parametrů než je třeba a než je definováno ve Stored proceduře.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback