JAK: Volání parametrické uložené procedury pomocí ADO.NET a Visual C# .NET

Pro Microsoft Visual Basic .NET verzi tohoto článku naleznete v tématu 308049 .

Microsoft Visual C++ .NET verzi tohoto článku naleznete v tématu 310071 .

Microsoft Visual J# .NET verzi tohoto článku naleznete v tématu 320627 .


Tento článek se týká následujících oborů názvů knihovny tříd rozhraní.NET Framework společnosti Microsoft:

  • System.Data.SqlClient
  • System.Data.OleDb

V TOMTO ÚKOLU

Souhrn

Pomocí tříd technologie ADO.NET volání uložené procedury a vrátit vrácené hodnoty a vrátit parametry, včetně několika způsoby:

  • Použijte objekt DataSet k získání vrácených řádků a pro práci s těmito řádky vrácené hodnoty a parametry vratky.
  • Pomocí objektu DataReader shromažďování vrácených řádků, chcete-li přesunout prostřednictvím těchto řádků a sbírat vrácené hodnoty a parametry vratky.
  • Použití ExecuteScalar metoda vrátí hodnotu z prvního sloupce výsledky první řádek vratky parametry a návratové hodnoty. To je nejužitečnější s agregační funkce.
  • Pomocí metody ExecuteNonQuery vrátit pouze vratky parametry a návratové hodnoty. Budou odstraněny všechny řádky vrácené. To je nejužitečnější pro provádění akční dotazy.
Tento článek ukazuje poslední tři metody a používá SqlCommand a OleDbCommand objektů. Přesvědčte se, zda kopírovat pouze kód spravovaného zprostředkovatele, který používáte. Pokud si nejste jisti, který spravovaného zprostředkovatel, byste měli použít, navštivte následující webu Microsoft Developer Network:
Všechny příklady v tomto článku parametry jsou přidány do kolekce parametrů objektu Command . Při použití objektu SqlCommand mají nepřidáte parametry v libovolném pořadí, ale parametry musí mít správný název. Při použití OleDbCommand objektu, je nutné přidat parametry ve správném pořadí a nelze použít parametry podle názvu.

Pomocí objektu DataReader vrátit řádky a parametry

Můžete použít objekt DataReader vrátit datový proud jen pro čtení, pouze pro předávání údajů. Informace, které obsahuje objekt DataReader mohou pocházet z uložené procedury. Tento příklad používá ke spuštění uložené procedury, která má vstup a výstupní parametr a prochází vrácené záznamy zobrazíte vracené parametry objektu DataReader .

  1. Vytvořte následující proceduru uloženou na serveru, který je spuštěn Microsoft SQL Server:
    Create Procedure TestProcedure(
    @au_idIN varchar (11),
    @numTitlesOUT Integer OUTPUT
    )
    AS

    select A.au_fname, A.au_lname, T.title
    from authors as A join titleauthor as TA on
    A.au_id=TA.au_id
    join titles as T
    on T.title_id=TA.title_id
    where A.au_id=@au_idIN
    set @numTitlesOUT = @@Rowcount
    return (5)

  2. Vytvořte nový projekt Visual C# .NET aplikace Windows.
  3. Použijte příkaz using na systém a obory názvů System.Data , takže není nutné kvalifikovat deklarace ve obory názvů později v kódu. Přidáte tento kód do horní části modulu kódu formuláře. Přesvědčte se, zda kopírovat pouze kód pro zprostředkovatele, který jste vybrali. Klient SQL
    using System.Data.SqlClient;
    Zprostředkovatel dat OLE DB
    using System.Data.OleDb;
  4. Nahraďte kód v soukromé události Form_Load následující kód:Klienta SQL
    SqlConnection PubsConn = new SqlConnection ("Data Source=server;integrated " + 
    "Security=sspi;initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand
    ("TestProcedure", PubsConn);

    testCMD.CommandType = CommandType.StoredProcedure;

    SqlParameter RetVal = testCMD.Parameters.Add
    ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add
    ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    SqlParameter NumTitles = testCMD.Parameters.Add
    ("@numtitlesout", SqlDbType.VarChar, 11);
    NumTitles.Direction = ParameterDirection.Output ;

    IdIn.Value = "213-46-8915";
    PubsConn.Open();

    SqlDataReader myReader = testCMD.ExecuteReader();
    Console.WriteLine ("Book Titles for this Author:");
    while (myReader.Read())
    {
    Console.WriteLine ("{0}", myReader.GetString (2));
    };
    myReader.Close() ;
    Console.WriteLine("Number of Rows: " + NumTitles.Value );
    Console.WriteLine("Return Value: " + RetVal.Value);

    Zprostředkovatel dat OLE DB
    OleDbConnection PubsConn = new OleDbConnection    ("Provider=SQLOLEDB;Data Source=server;" + 
    "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand
    ("TestProcedure", PubsConn);

    testCMD.CommandType = CommandType.StoredProcedure;

    OleDbParameter RetVal = testCMD.Parameters.Add
    ("RetVal", OleDbType.Integer);RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add
    ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    OleDbParameter NumTitles = testCMD.Parameters.Add
    ("@numtitlesout", OleDbType.VarChar, 11);
    NumTitles.Direction = ParameterDirection.Output;

    IdIn.Value = "213-46-8915";

    PubsConn.Open();

    OleDbDataReader myReader = testCMD.ExecuteReader();
    Console.WriteLine ("Book Titles for this Author:");
    while (myReader.Read())
    {
    Console.WriteLine ("{0}", myReader.GetString (2));
    };
    myReader.Close() ;
    Console.WriteLine("Number of Rows: " + NumTitles.Value );
    Console.WriteLine("Return Value: " + RetVal.Value);

  5. Upravte připojovací řetězec pro objekt připojení přejděte na počítač, který je spuštěn SQL Server.
  6. Spusťte kód. Všimněte si, že objekt DataReader načítá záznamy a vrátí hodnoty parametrů. Chcete-li procházet vrácených záznamů můžete použít metodu čtení objektu DataReader .

    Okno výstup zobrazuje názvy dvou knih, vrácená hodnota 5 a výstupní parametr, který obsahuje počet záznamů (2). Všimněte si, že je třeba zavřít DataReader v kódu zobrazit hodnoty parametru. Navíc Všimněte si, že není nutné procházet všechny záznamy zobrazíte vracené parametry, pokud objektu DataReader je uzavřen.

Použití ExecuteScalar metoda objektu příkazu

ExecuteScalar metoda objektu příkaz slouží k načtení hodnot parametrů. Navíc ExecuteScalar vrátí první sloupec první řádek uložené procedury. To je nejužitečnější pro agregační funkce jako v následujícím příkladu.

  1. Vytvořte následující proceduru uloženou na serveru, který je spuštěn SQL Server:
    Create Procedure TestProcedure2(
    @au_idIN varchar (11)
    )
    As
    /* set nocount on */
    select count (T.title)
    from authors as A join titleauthor as TA on
    A.au_id=TA.au_id
    join titles as T
    on T.title_id=TA.title_id
    where A.au_id=@au_idIN
    Return(5)

  2. Vytvořte nový projekt Visual C# .NET aplikace Windows.
  3. Použijte příkaz using na systém a obory názvů System.Data , takže není nutné kvalifikovat deklarace ve obory názvů později v kódu. Přidáte tento kód do horní části modulu kódu formuláře. Přesvědčte se, zda kopírovat pouze kód pro zprostředkovatele, který jste vybrali. Klient SQL
    using System.Data.SqlClient;
    Zprostředkovatel dat OLE DB
    using System.Data.OleDb;
  4. Přidejte následující kód události Form_Load :Klienta SQL
    string strCount;SqlConnection PubsConn = new SqlConnection 
    ("Data Source=server;integrated " +
    "Security=sspi;initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand
    ("TestProcedure2", PubsConn);

    testCMD.CommandType = CommandType.StoredProcedure;

    SqlParameter RetVal = testCMD.Parameters.Add
    ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add
    ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;

    IdIn.Value = "213-46-8915";

    PubsConn.Open();

    strCount =testCMD.ExecuteScalar ().ToString() ;

    Console.WriteLine("Number of Rows: " + strCount );
    Console.WriteLine("Return Value: " + RetVal.Value);

    Zprostředkovatel dat OLE DB
    string strCount;OleDbConnection PubsConn = new OleDbConnection 
    ("Provider=SQLOLEDB;Data Source=server;" +
    "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand
    ("TestProcedure2", PubsConn);

    testCMD.CommandType = CommandType.StoredProcedure;

    OleDbParameter RetVal = testCMD.Parameters.Add
    ("RetVal", OleDbType.Integer);
    RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add
    ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;

    IdIn.Value = "213-46-8915";

    PubsConn.Open();

    strCount = testCMD.ExecuteScalar().ToString() ;

    Console.WriteLine("Number of Rows: " + strCount);
    Console.WriteLine("Return Value: " + RetVal.Value);

  5. Upravte připojovací řetězec pro objekt připojení přejděte na počítač, který je spuštěn SQL Server.
  6. Spusťte kód. Všimněte si, že ExecuteScalar metoda objektu příkaz vrátí parametry. ExecuteScalar také vrátí hodnotu 1, řádek 1 sady řádků vrácených sloupec. Hodnota intCount je tedy výsledek funkce Počet z uložené procedury.

Použití ExecuteNonQuery metoda objektu příkazu

V tomto příkladu ExecuteNonQuery metoda spuštění dotazu a vrácení hodnoty parametrů. ExecuteNonQuery rovněž vrací počet záznamů, které jsou ovlivněny po spuštění dotazu. Nicméně ExecuteNonQuery nevrátí žádné řádky nebo sloupce z uložené procedury.

ExecuteNonQuery metoda je nejužitečnější, pokud potřebujete vědět, kolik řádků se změní použijete příkazy INSERT, UPDATE nebo DELETE. V uložené proceduře, ve kterém používáte pouze příkaz SELECT zobrazí hodnotu -1, protože dotazem ovlivněny žádné řádky.

  1. V počítači, který je spuštěn SQL Server, vytvořte následující uložené procedury:
    Create Procedure TestProcedure3(
    @au_idIN varchar (11),
    @au_fnam varchar (30)
    )

    As
    /* set nocount on */
    Update authors set au_fname = @au_fnam
    where au_id = @au_idin
    return (5)

  2. Vytvořte nový projekt Visual C# .NET aplikace Windows.
  3. Použijte příkaz using na systém a obory názvů System.Data , takže není nutné kvalifikovat deklarace ve obory názvů později v kódu. Přidáte tento kód do horní části modulu kódu formuláře. Přesvědčte se, zda kopírovat pouze kód pro zprostředkovatele, který jste vybrali. Klient SQL
    using System.Data.SqlClient;
    Zprostředkovatel dat OLE DB
    using System.Data.OleDb;
  4. Kód pod soukromé události Form1_Load v modulu kódu Form1 nahraďte následující kód:Klienta SQL
    string strRowAffect;SqlConnection PubsConn = new SqlConnection 
    ("Data Source=server;integrated Security=sspi;" +
    "initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand
    ("TestProcedure3", PubsConn);

    testCMD.CommandType = CommandType.StoredProcedure;

    SqlParameter RetVal = testCMD.Parameters.Add
    ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add
    ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    SqlParameter FnameIn = testCMD.Parameters.Add
    ("@au_fnam", SqlDbType.VarChar, 30);
    FnameIn.Direction = ParameterDirection.Input;

    IdIn.Value = "213-46-8915";
    FnameIn.Value = "Marjorie";

    PubsConn.Open();

    strRowAffect =testCMD.ExecuteNonQuery ().ToString() ;

    Console.WriteLine("Number of Rows: " + strRowAffect );
    Console.WriteLine("Return Value: " + RetVal.Value);

    Zprostředkovatel dat OLE DB
    int intRowAffected;OleDbConnection PubsConn = new OleDbConnection 
    ("Provider=SQLOLEDB;Data Source=server;" +
    "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand
    ("TestProcedure3", PubsConn);

    testCMD.CommandType = CommandType.StoredProcedure;

    OleDbParameter RetVal = testCMD.Parameters.Add
    ("RetVal", OleDbType.Integer);
    RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add
    ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    OleDbParameter FnameIn = testCMD.Parameters.Add
    ("@au_fname", OleDbType.VarChar, 30);
    FnameIn.Direction = ParameterDirection.Input;

    IdIn.Value = "213-46-8915";
    FnameIn.Value = "Marjorie";

    PubsConn.Open();
    intRowAffected = testCMD.ExecuteNonQuery();

    Console.WriteLine("Number of Rows affected: " + intRowAffected);
    Console.WriteLine(RetVal.Value);

  5. Upravte připojovací řetězec pro objekt připojení přejděte na počítač, který je spuštěn SQL Server.
  6. Spusťte kód. Okno výstup zobrazuje počet ovlivněné řádky (intRowAffect) a hodnotu návratový parametr.

Odkazy

Vlastnosti

ID článku: 310070 - Poslední kontrola: 20. 1. 2017 - Revize: 1

Microsoft ADO.NET 1.1, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition

Váš názor