Cách thực hiện một thủ tục được lưu trữ trong chương trình C #


254

Tôi muốn thực hiện thủ tục được lưu trữ này từ một chương trình C #.

Tôi đã viết thủ tục được lưu trữ sau đây trong cửa sổ truy vấn SqlServer và lưu nó dưới dạng archive1:

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

EDITED:

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

Điều này hiển thị ngoại lệ Cannot find the stored procedure dbo.test. Tôi có cần cung cấp đường dẫn không? Nếu có, các thủ tục lưu trữ nên được lưu trữ ở vị trí nào?


3
Bạn nên sử dụng một cơ sở dữ liệu khác ngoài chủ để kiểm tra. Đây là một cơ sở dữ liệu hệ thống và cuối cùng bạn sẽ gây ra vấn đề. Trong SQL 2012, nó sẽ không cho phép tôi tạo một bảng ở đó. Ngược lại, nó sẽ cho phép tôi tạo ra một vòng quay. : /
Joe Johnston

Câu trả lời mặc dù: bạn đã kiểm tra xem sp của bạn có thực sự được tạo ra với tên bạn đã đặt (dbo.test) không? Tôi không biết điều gì sẽ xảy ra nếu một người dùng không phải là dbo cố gắng tạo dbo.test ... nó có được tạo ra không phải là dbo.test không?
DigCamara

5
@obayhan Câu hỏi này đã được hỏi 2 năm trước khi bạn cho rằng nó là một bản sao có thể có. Xin vui lòng, trong tương lai, đánh dấu câu hỏi gần đây nhất là trùng lặp.
RyanfaeScotland

Câu trả lời:


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

51
Bạn thậm chí có thể thoát khỏi conn.Close, được ngụ ý bởiDispose
Remus Rusanu

16
Điều đó đúng với trường hợp này. Tôi muốn có kết hợp OpenClosecuộc gọi. Nếu bạn nói, hãy cấu trúc lại đối tượng kết nối thành một trường trong tương lai và xóa câu lệnh sử dụng, bạn có thể vô tình quên thêm Closevà kết thúc bằng một kết nối mở.
Mehrdad Afshari

11
Làm thế nào bạn sẽ làm điều này nếu các lưu trữ cần thiết tham số? chỉ cần thêm các tham số cho đối tượng lệnh có cùng tên và loại?
Dani

5
@Dani Vâng. Chỉ cần thêm các tham số vào Parametersbộ sưu tập của SqlCommandđối tượng.
Mehrdad Afshari

Tôi có thể gửi tùy chọn giá trị DROPDOWN trong SP không?
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"]);
        }
    }
}

Dưới đây là một số liên kết thú vị bạn có thể đọc:


32
Bạn thực sự nên sử dụng từ khóa "sử dụng". Đẩy trách nhiệm mở / đóng đó vào khuôn khổ.
TruMan1

1
Định nghĩa của SqlCommand : public sealed class SqlCommand : System.Data.Common.DbCommand, ICloneable, IDisposable. Đặt nó vào usingtuyên bố sẽ giúp làm sạch.
themefield

24

Thủ tục gọi cửa hàng trong 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();

}}

Tôi lo lắng về cách cmd.CommandText = "Stored1" diễn giải thủ tục được lưu trữ của tôi. Tôi không biết.
Dễ thương

2
"CommandText" phải được đặt thành TÊN của thủ tục được lưu trữ, sau đó được thực thi từ C # như thể bạn đã thực thi "exec StoredProcedureName" trong SSMS - hoặc bạn lo lắng về điều gì?
marc_s

Làm thế nào tôi có thể cung cấp tên được lưu trữ cho thủ tục được lưu trữ ở trên, bạn có thể cho tôi biết không ??
Dễ thương

vì vậy, trước tiên, bạn sẽ phải tạo thủ tục được lưu trữ, trong trường hợp mã bạn có, bạn cần thêm: "tạo thủ tục dbo.NameOfYourStoredProcedureHere là" lúc đầu
BlackTigerX

1
@Cute: nếu bạn có quy trình này được lưu trữ, bạn PHẢI có tên! Tên được sử dụng trong lệnh gọi "TẠO QUY TRÌNH (tên thủ tục)". Nếu bạn không có điều đó, thì bạn không có một thủ tục được lưu trữ (mà chỉ là một loạt các câu lệnh T-SQL) và sau đó bạn không thể sử dụng "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

Đây là mã để thực hiện các thủ tục được lưu trữ có và không có tham số thông qua sự phản chiếu. Lưu ý rằng tên thuộc tính đối tượng cần khớp với các tham số của thủ tục được lưu trữ.

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

Bằng cách sử dụng 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

Dòng bình luận của bạn bị hỏng, ngoài ra nếu bạn có thể đưa ra quy trình được lưu trữ trong bình luận của bạn sẽ tốt cho chúng tôi.
PeerNet

đã thêm các thủ tục được lưu trữ trong mã, kiểm tra nó.
Johnny

4

đây là một ví dụ về một thủ tục được lưu trữ trả về một giá trị và nó được thực thi trong 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

Sử dụng Dapper. Vì vậy, tôi đã thêm điều này, tôi hy vọng bất cứ ai giúp đỡ.

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

Vui lòng kiểm tra Crane (Tôi là tác giả)

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

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

Cũng có một loạt các tính năng khác mà bạn có thể thích.


cái này không hoạt động Đây có phải là lỗi thời? Tôi không thể tìm thấy thủ tục phương pháp.
Maddy

Tôi đã cập nhật ví dụ, cảm ơn vì đã cho tôi biết.
Greg R Taylor

Làm thế nào để bạn trả lại nhiều bộ dữ liệu với Crane? Proc lưu trữ của tôi trả về 3 tập dữ liệu và tôi chỉ quan tâm đến tập dữ liệu thứ hai. Nhưng Crane chỉ trả lại cho tôi cái đầu tiên.
Hoàng Minh

1

Bạn có nghĩa là mã của bạn là DDL? Nếu vậy, MSSQL không có sự khác biệt. Trên ví dụ cũng cho thấy làm thế nào để gọi này. Chỉ cần đảm bảo

CommandType = CommandType.Text

1

Không có câu trả lời Dapper ở đây. Vì vậy, tôi đã thêm một

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.