C # programında saklı yordam nasıl yürütülür


254

Bu saklı yordamı bir C # programından yürütmek istiyorum.

Bir SqlServer sorgu penceresinde aşağıdaki saklı yordamı yazdım ve depolanmış1 olarak kaydetti:

use master 
go
create procedure dbo.test as

DECLARE @command as varchar(1000), @i int
SET @i = 0
WHILE @i < 5
BEGIN
Print 'I VALUE ' +CONVERT(varchar(20),@i)
EXEC(@command)
SET @i = @i + 1
END

REDAKTE:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace AutomationApp
{
    class Program
    {
        public void RunStoredProc()
        {
            SqlConnection conn = null;
            SqlDataReader rdr  = null;

            Console.WriteLine("\nTop 10 Most Expensive Products:\n");

            try
            {
                conn = new SqlConnection("Server=(local);DataBase=master;Integrated Security=SSPI");
                conn.Open();
                SqlCommand cmd = new SqlCommand("dbo.test", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                rdr = cmd.ExecuteReader();
                /*while (rdr.Read())
                {
                    Console.WriteLine(
                        "Product: {0,-25} Price: ${1,6:####.00}",
                        rdr["TenMostExpensiveProducts"],
                        rdr["UnitPrice"]);
                }*/
            }
            finally
            {
                if (conn != null)
                {
                    conn.Close();
                }
                if (rdr != null)
                {
                    rdr.Close();
                }
            }
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World");
            Program p= new Program();
            p.RunStoredProc();      
            Console.Read();
        }
    }
}

Bu, istisnayı görüntüler Cannot find the stored procedure dbo.test. Yolu sağlamam gerekir mi? Evetse, saklı yordamlar hangi konumda saklanmalıdır?


3
Test için bile master dışında bir veritabanı kullanmak daha iyidir. Bu bir sistem veritabanıdır ve sonunda sorunlara neden olacaksınız. SQL 2012'de orada bir tablo oluşturmama izin vermiyor. Tersine bir sproc oluşturmama izin verecek. : /
Joe Johnston

Buna rağmen cevaplar: sp'nizin gerçekten verdiğiniz adla (dbo.test) oluşturulduğunu kontrol ettiniz mi? Bir dbo olmayan kullanıcı dbo.test oluşturmaya çalışırsa ne olacağını bilmiyorum ... dbo.test olmayan olarak oluşturulur?
DigCamara

5
@obayhan Bu soru, olası bir kopyası olduğunu iddia ettiğinizden 2 yıl önce soruldu. Lütfen, gelecekte, en son soruyu kopya olarak işaretleyin.
RyanfaeScotland

Yanıtlar:


333
using (var conn = new SqlConnection(connectionString))
using (var command = new SqlCommand("ProcedureName", conn) { 
                           CommandType = CommandType.StoredProcedure }) {
   conn.Open();
   command.ExecuteNonQuery();
}

51
Hatta kurtulabilirsiniz conn.Close, ima ederDispose
Remus Rusanu

16
Bu dava için bu doğru. Eşleştirme Openve Closearama yapmayı seviyorum . İleride, bağlantı nesnesini gelecekte bir alan olarak yeniden düzenleyin ve using ifadesini kaldırın, yanlışlıkla Closeaçık bir bağlantı eklemeyi ve sonlandırmayı unutabilirsiniz .
Mehrdad Afshari

11
Depolanan proc parametrelere ihtiyaç duyuyorsa bunu nasıl yapardınız? sadece aynı ad ve tipte komut nesnesine parametreleri ekleyin?
Dani

5
@Dani Evet. Parametreleri nesnenin Parameterskoleksiyonuna eklemeniz SqlCommandyeterlidir.
Mehrdad Afshari

SP'deki DROPDOWN değer seçeneğinde gönderebilecek miyim?
SearchForKnowledge

246
using (SqlConnection conn = new SqlConnection("Server=(local);DataBase=Northwind;Integrated Security=SSPI")) {
    conn.Open();

    // 1.  create a command object identifying the stored procedure
    SqlCommand cmd  = new SqlCommand("CustOrderHist", conn);

    // 2. set the command object so it knows to execute a stored procedure
    cmd.CommandType = CommandType.StoredProcedure;

    // 3. add parameter to command, which will be passed to the stored procedure
    cmd.Parameters.Add(new SqlParameter("@CustomerID", custId));

    // execute the command
    using (SqlDataReader rdr = cmd.ExecuteReader()) {
        // iterate through results, printing each to console
        while (rdr.Read())
        {
            Console.WriteLine("Product: {0,-35} Total: {1,2}",rdr["ProductName"],rdr["Total"]);
        }
    }
}

İşte okuyabileceğiniz bazı ilginç bağlantılar:


32
Gerçekten "using" anahtar kelimesini kullanmalısınız. Bu açık / kapalı sorumluluğu çerçeveye itin.
TruMan1

1
SqlCommand Tanımı: public sealed class SqlCommand : System.Data.Common.DbCommand, ICloneable, IDisposable. Bunu açıklığa usingkavuşturmak, temizlemeye yardımcı olacaktır.
themefield

24

C # 'da Mağaza Yordamını Çağırma

    SqlCommand cmd = new SqlCommand("StoreProcedureName",con);
    cmd.CommandType=CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@value",txtValue.Text);
    con.Open();
    int rowAffected=cmd.ExecuteNonQuery();
    con.Close();

21
using (SqlConnection sqlConnection1 = new SqlConnection("Your Connection String")) {
using (SqlCommand cmd = new SqlCommand()) {
  Int32 rowsAffected;

  cmd.CommandText = "StoredProcedureName";
  cmd.CommandType = CommandType.StoredProcedure;
  cmd.Connection = sqlConnection1;

  sqlConnection1.Open();

  rowsAffected = cmd.ExecuteNonQuery();

}}

Cmd.CommandText = "Stored1" 'in saklı yordamımı nasıl yorumladığı konusunda endişeliyim.
Sevimli

2
"CommandText" saklı yordamın adı olarak ayarlanmalıdır, daha sonra SSMS'de "exec StoredProcedureName" yürütmüş gibi C # yürütülür - veya ne hakkında endişeleniyorsunuz?
marc_s

Yukarıdaki saklı yordam için saklanan prosedür adını nasıl verebilirim u plz bana söyleyebilir?
Sevimli

bu nedenle, ilk olarak, saklı yordamı oluşturmak zorunda kalacaksınız, sahip olduğunuz kod durumunda şunları eklemeniz gerekir: "yordam oluştur dbo.NameOfYourStoredProcedureHere" başında
BlackTigerX

1
@Sevimli: Eğer saklı yordam olarak varsa , bir isim olması GEREKİR ! "PROSEDÜR OLUŞTUR (prosedür adı)" çağrısında kullanılan ad. Eğer bu yoksa, o zaman saklı bir prosedür (ama sadece bir grup T-SQL deyimleri) yok ve sonra "CommandType = StoredProcedure", obviusly kullanamazsınız
marc_s

15
SqlConnection conn = null;
SqlDataReader rdr  = null;
conn = new SqlConnection("Server=(local);DataBase=Northwind;Integrated Security=SSPI");
conn.Open();

// 1.  create a command object identifying
//     the stored procedure
SqlCommand cmd  = new SqlCommand("CustOrderHist", conn);

// 2. set the command object so it knows
//    to execute a stored procedure
cmd.CommandType = CommandType.StoredProcedure;

// 3. add parameter to command, which
//    will be passed to the stored procedure
cmd.Parameters.Add(new SqlParameter("@CustomerID", custId));

// execute the command
rdr = cmd.ExecuteReader();

// iterate through results, printing each to console
while (rdr.Read())
{
    Console.WriteLine("Product: {0,-35} Total: {1,2}", rdr["ProductName"], rdr["Total"]);
}

14

Bu, saklı yordamları yansıma yoluyla ve dışarı parametreleriyle yürütmek için kullanılan koddur. Nesnelerin özellik adlarının saklı yordamın parametreleriyle eşleşmesi gerektiğini unutmayın.

private static string ConnString = ConfigurationManager.ConnectionStrings["SqlConnection"].ConnectionString;
    private SqlConnection Conn = new SqlConnection(ConnString);

    public void ExecuteStoredProcedure(string procedureName)
    {
        SqlConnection sqlConnObj = new SqlConnection(ConnString);

        SqlCommand sqlCmd = new SqlCommand(procedureName, sqlConnObj);
        sqlCmd.CommandType = CommandType.StoredProcedure;

        sqlConnObj.Open();
        sqlCmd.ExecuteNonQuery();
        sqlConnObj.Close();
    }

    public void ExecuteStoredProcedure(string procedureName, object model)
    {
        var parameters = GenerateSQLParameters(model);
        SqlConnection sqlConnObj = new SqlConnection(ConnString);

        SqlCommand sqlCmd = new SqlCommand(procedureName, sqlConnObj);
        sqlCmd.CommandType = CommandType.StoredProcedure;

        foreach (var param in parameters)
        {
            sqlCmd.Parameters.Add(param);
        }

        sqlConnObj.Open();
        sqlCmd.ExecuteNonQuery();
        sqlConnObj.Close();
    }

    private List<SqlParameter> GenerateSQLParameters(object model)
    {
        var paramList = new List<SqlParameter>();
        Type modelType = model.GetType();
        var properties = modelType.GetProperties();
        foreach (var property in properties)
        {
            if (property.GetValue(model) == null)
            {
                paramList.Add(new SqlParameter(property.Name, DBNull.Value));
            }
            else
            {
                paramList.Add(new SqlParameter(property.Name, property.GetValue(model)));
            }
        }
        return paramList;

    }

5

Ado.net kullanarak

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace PBDataAccess
{
    public class AddContact
    {   
        // for preparing connection to sql server database   

        private SqlConnection conn; 

        // for preparing sql statement or stored procedure that 
        // we want to execute on database server

        private SqlCommand cmd; 

        // used for storing the result in datatable, basically 
        // dataset is collection of datatable

        private DataSet ds; 

        // datatable just for storing single table

        private DataTable dt; 

        // data adapter we use it to manage the flow of data
        // from sql server to dataset and after fill the data 
        // inside dataset using fill() method   

        private SqlDataAdapter da; 


        // created a method, which will return the dataset

        public DataSet GetAllContactType() 
        {



    // retrieving the connection string from web.config, which will 
    // tell where our database is located and on which database we want
    // to perform opearation, in this case we are working on stored 
    // procedure so you might have created it somewhere in your database. 
    // connection string will include the name of the datasource, your 
    // database name, user name and password.

        using (conn = new SqlConnection(ConfigurationManager.ConnectionString["conn"]
        .ConnectionString)) 

                {
                    // Addcontact is the name of the stored procedure
                    using (cmd = new SqlCommand("Addcontact", conn)) 

                    {
                        cmd.CommandType = CommandType.StoredProcedure;

                    // here we are passing the parameters that 
                    // Addcontact stored procedure expect.
                     cmd.Parameters.Add("@CommandType",
                     SqlDbType.VarChar, 50).Value = "GetAllContactType"; 

                        // here created the instance of SqlDataAdapter
                        // class and passed cmd object in it
                        da = new SqlDataAdapter(cmd); 

                        // created the dataset object
                        ds = new DataSet(); 

                        // fill the dataset and your result will be
                        stored in dataset
                        da.Fill(ds); 
                    }                    
            }  
            return ds;
        }
}

****** Stored Procedure ******

CREATE PROCEDURE Addcontact
@CommandType VARCHAR(MAX) = NULL
AS
BEGIN
  IF (@CommandType = 'GetAllContactType')
  BEGIN
    SELECT * FROM Contacts
  END
END

Yorum satırlarınız, ayrıca yorumunuzda bizim için iyi olacak saklı yordam verebilirseniz kırılır.
PeerNet

saklı yordamı kodda eklediyseniz, kontrol edin.
Johnny

4

Bu bir değer döndüren saklı yordamın bir örneğidir ve c #

CREATE PROCEDURE [dbo].[InsertPerson]   
-- Add the parameters for the stored procedure here  
@FirstName nvarchar(50),@LastName nvarchar(50),  
@PersonID int output  
AS  
BEGIN  
    insert [dbo].[Person](LastName,FirstName) Values(@LastName,@FirstName)  

    set @PersonID=SCOPE_IDENTITY()  
END  
Go  


--------------
 // Using stored procedure in adapter to insert new rows and update the identity value.  
   static void InsertPersonInAdapter(String connectionString, String firstName, String lastName) {  
      String commandText = "dbo.InsertPerson";  
      using (SqlConnection conn = new SqlConnection(connectionString)) {  
         SqlDataAdapter mySchool = new SqlDataAdapter("Select PersonID,FirstName,LastName from [dbo].[Person]", conn);  

         mySchool.InsertCommand = new SqlCommand(commandText, conn);  
         mySchool.InsertCommand.CommandType = CommandType.StoredProcedure;  

         mySchool.InsertCommand.Parameters.Add(  
             new SqlParameter("@FirstName", SqlDbType.NVarChar, 50, "FirstName"));  
         mySchool.InsertCommand.Parameters.Add(  
             new SqlParameter("@LastName", SqlDbType.NVarChar, 50, "LastName"));  

         SqlParameter personId = mySchool.InsertCommand.Parameters.Add(new SqlParameter("@PersonID", SqlDbType.Int, 0, "PersonID"));  
         personId.Direction = ParameterDirection.Output;  

         DataTable persons = new DataTable();  
         mySchool.Fill(persons);  

         DataRow newPerson = persons.NewRow();  
         newPerson["FirstName"] = firstName;  
         newPerson["LastName"] = lastName;  
         persons.Rows.Add(newPerson);  

         mySchool.Update(persons);  
         Console.WriteLine("Show all persons:");  
         ShowDataTable(persons, 14); 

2

Dapper Kullanımı. bu yüzden ben kimse yardım umuyoruz ekledi.

public void Insert(ProductName obj)
        {
            SqlConnection connection = new SqlConnection(Connection.GetConnectionString());
            connection.Open();
            connection.Execute("ProductName_sp", new
            { @Name = obj.Name, @Code = obj.Code, @CategoryId = obj.CategoryId, @CompanyId = obj.CompanyId, @ReorderLebel = obj.ReorderLebel, @logo = obj.logo,@Status=obj.Status, @ProductPrice = obj.ProductPrice,
                @SellingPrice = obj.SellingPrice, @VatPercent = obj.VatPercent, @Description=obj.Description, @ColourId = obj.ColourId, @SizeId = obj.SizeId,
                @BrandId = obj.BrandId, @DisCountPercent = obj.DisCountPercent, @CreateById =obj.CreateById, @StatementType = "Create" }, commandType: CommandType.StoredProcedure);
            connection.Close();
        }

2

Lütfen Crane'ye bakın (ben yazarım)

https://www.nuget.org/packages/Crane/

SqlServerAccess sqlAccess = new SqlServerAccess("your connection string");
var result = sqlAccess.Command().ExecuteNonQuery("StoredProcedureName");

Ayrıca beğenebileceğiniz başka özellikler de var.


bu çalışmıyor. Bu modası geçmiş mi? Yordam yöntemini bulamadım.
Maddy

Örneği güncelledim, bana bildirdiğiniz için teşekkürler.
Greg R Taylor

Crane ile birden çok veri kümesini nasıl döndürürsünüz? Depolanan proc'um 3 veri kümesi döndürüyor ve yalnızca ikinci veri kümesiyle ilgileniyorum. Ama Crane sadece ilkini bana geri veriyor.
Hoang Minh

1

Kodun DDL mi demek istiyorsun? Öyleyse, MSSQL'in hiçbir farkı yoktur. Yukarıdaki örnekler bunun nasıl çağrıldığını iyi göstermektedir. Sadece emin ol

CommandType = CommandType.Text

1

Yok Zarif burada cevap. Bu yüzden bir tane ekledim

using Dapper;
using System.Data.SqlClient;

using (var cn = new SqlConnection(@"Server=(local);DataBase=master;Integrated Security=SSPI"))
    cn.Execute("dbo.test", commandType: CommandType.StoredProcedure);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.