Bagaimana menjalankan prosedur tersimpan dalam program C #


254

Saya ingin menjalankan prosedur tersimpan ini dari program C #.

Saya telah menulis prosedur tersimpan berikut ini di jendela kueri SqlServer dan menyimpannya sebagai disimpan1:

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

Diedit:

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();
        }
    }
}

Ini menampilkan pengecualian Cannot find the stored procedure dbo.test. Apakah saya perlu memberikan jalannya? Jika ya, di lokasi mana prosedur tersimpan harus disimpan?


3
Anda lebih baik menggunakan database selain master bahkan untuk pengujian. Ini adalah basis data sistem dan Anda akan menyebabkan masalah pada akhirnya. Dalam SQL 2012 tidak akan membiarkan saya membuat tabel di sana. Sebaliknya akan memungkinkan saya untuk membuat sproc. : /
Joe Johnston

Meskipun demikian: sudahkah Anda memeriksa apakah sp Anda benar-benar dibuat dengan nama yang Anda berikan (dbo.test)? Saya tidak tahu apa yang akan terjadi jika pengguna non-dbo mencoba membuat dbo.test ... apakah ini akan dibuat sebagai non-dbo.test?
DigCamara

5
@obayhan Pertanyaan ini ditanyakan 2 tahun sebelum yang Anda klaim sebagai kemungkinan duplikat. Tolong, di masa depan, tandai pertanyaan terbaru sebagai duplikat.
RyanfaeScotland

Jawaban:


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

51
Anda bahkan dapat menyingkirkan conn.Close, tersirat olehDispose
Remus Rusanu

16
Itu benar untuk kasus ini. Saya suka ada yang cocok Opendan Closemenelepon. Jika Anda mengatakan, refactor objek koneksi keluar sebagai bidang di masa depan dan menghapus pernyataan menggunakan, Anda mungkin tidak sengaja lupa untuk menambahkan Closedan berakhir dengan koneksi terbuka.
Mehrdad Afshari

11
Bagaimana Anda melakukan ini jika proc yang disimpan memerlukan parameter? cukup tambahkan parameter ke objek perintah dengan nama dan tipe yang sama?
Dani

5
@Dani Ya. Cukup tambahkan parameter ke Parameterskoleksi SqlCommandobjek.
Mehrdad Afshari

Apakah saya dapat mengirim opsi nilai DROPDOWN di SP?
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"]);
        }
    }
}

Berikut beberapa tautan menarik yang bisa Anda baca:


32
Anda harus benar-benar menggunakan kata kunci "menggunakan". Dorong tanggung jawab buka / tutup itu ke kerangka kerja.
TruMan1

1
Definisi SqlCommand: public sealed class SqlCommand : System.Data.Common.DbCommand, ICloneable, IDisposable. Masukkan ke dalam usingpernyataan akan membantu membersihkan.
themefield

24

Prosedur Memanggil Toko di C #

    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();

}}

Saya khawatir tentang bagaimana cmd.CommandText = "Stored1" mengartikan prosedur tersimpan saya. Saya tidak tahu.
Cute

2
"CommandText" harus disetel ke NAMA dari prosedur tersimpan, yang kemudian dieksekusi dari C # seolah-olah Anda telah mengeksekusi "exec StoredProcedureName" di SSMS - atau apa yang Anda khawatirkan?
marc_s

Bagaimana saya bisa memberikan nama prosedur yang tersimpan untuk prosedur yang tersimpan di atas dapatkah Anda katakan padaku ??
Lucu

jadi, pertama, Anda harus membuat prosedur tersimpan, dalam kasus kode yang Anda miliki, Anda perlu menambahkan: "create procedure dbo.NameOfYourStoredProcedureHere as as" di awal
BlackTigerX

1
@Cute: jika Anda memiliki ini sebagai prosedur tersimpan, Anda HARUS memiliki nama! Nama yang digunakan dalam panggilan "CREATE PROCEDURE (prosedurename)". Jika Anda tidak memilikinya, maka Anda tidak memiliki prosedur tersimpan (tetapi hanya sejumlah pernyataan T-SQL) dan kemudian Anda tidak dapat menggunakan "CommandType = StoredProcedure", obviusly
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

Ini adalah kode untuk menjalankan prosedur tersimpan dengan dan tanpa parameter melalui refleksi. Perhatikan bahwa nama properti objek harus cocok dengan parameter prosedur yang tersimpan.

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

Dengan menggunakan Ado.net

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

Baris komentar Anda rusak, juga jika Anda dapat memberikan prosedur tersimpan dalam komentar Anda yang akan baik bagi kami.
PeerNet

telah menambahkan prosedur tersimpan dalam kode, periksa.
Johnny

4

ini adalah contoh dari prosedur tersimpan yang mengembalikan nilai dan eksekusi di 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

Menggunakan Dapper. jadi saya menambahkan ini saya harap ada yang membantu.

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

Silakan periksa Crane (saya penulisnya)

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

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

Juga memiliki banyak fitur lain yang mungkin Anda sukai.


ini tidak bekerja. Apakah ini ketinggalan jaman? Saya tidak dapat menemukan Prosedur prosedur.
Maddy

Saya telah memperbarui contohnya, terima kasih telah memberi tahu saya.
Greg R Taylor

Bagaimana Anda mengembalikan beberapa dataset dengan Crane? Proc saya yang disimpan mengembalikan 3 set data, dan saya hanya tertarik pada set data kedua. Tapi Crane hanya mengembalikan saya yang pertama.
Hoang Minh

1

Maksud Anda, kode Anda adalah DDL? Jika demikian, MSSQL tidak memiliki perbedaan. Contoh di atas dengan baik menunjukkan cara menjalankan ini. Pastikan saja

CommandType = CommandType.Text

1

Tidak ada jawaban Dapper di sini. Jadi saya menambahkan satu

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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.