问答中心分类: SQL如何在C程序中执行存储过程
0
Vaibhav Bhootna 提问 1月 前

我想从C程序执行这个存储过程。
我在SqlServer查询窗口中编写了以下存储过程,并将其保存为

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

已编辑:

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

这将显示异常Cannot find the stored procedure dbo.test。我需要提供路径吗?如果是,存储过程应该存储在哪个位置?

14 Answers
0
mmx 回答 1月 前
using (var conn = new SqlConnection(connectionString))
using (var command = new SqlCommand("ProcedureName", conn) { 
                           CommandType = CommandType.StoredProcedure }) {
   conn.Open();
   command.ExecuteNonQuery();
}
Remus Rusanu 回复 1月 前

你甚至可以摆脱conn.Close,由Dispose

mmx 回复 1月 前

对这个案子来说是这样的。我喜欢搭配OpenClose电话。如果您说,将来将连接对象重构为字段并删除using语句,您可能会意外忘记添加Close最后是一个开放的连接。

Dani 回复 1月 前

如果存储过程需要参数,您会怎么做?只需使用相同的名称和类型将参数添加到命令对象?

mmx 回复 1月 前

@Dani是的。只需将参数添加到Parameters收集SqlCommand对象

0
Bhaskar 回答 1月 前
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"]);
        }
    }
}

以下是一些您可以阅读的有趣链接:

TruMan1 回复 1月 前

你真的应该使用“using”关键字。将开放/封闭责任推到框架上。

themefield 回复 1月 前

SqlCommand的定义:public sealed class SqlCommand : System.Data.Common.DbCommand, ICloneable, IDisposable.将其放入using声明将有助于清理。

0
Vaibhav Bhootna 回答 1月 前

在C#中调用存储过程:

SqlCommand cmd = new SqlCommand("StoredProcedureName",con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@value",txtValue.Text);

con.Open();
int rowAffected = cmd.ExecuteNonQuery();
con.Close();
0
BlackTigerX 回答 1月 前
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();

}}
Cute 回复 1月 前

我很担心cmd会怎样。CommandText=“Stored1”解释我的存储过程。我不知道。

marc_s 回复 1月 前

“CommandText”必须设置为存储过程的名称,然后从C#执行该存储过程,就像您在SSMS中执行了“exec StoredProcedureName”——或者您担心什么?

Cute 回复 1月 前

我如何为上述存储过程命名storedprocedure?你能告诉我吗??

BlackTigerX 回复 1月 前

因此,首先,您必须创建存储过程,对于您拥有的代码,您需要在开头添加:“create procedure dbo.nameofyourdstoredprocedurehere as”

marc_s 回复 1月 前

@可爱:如果你把它作为存储过程,你必须有名字!“CREATE PROCEDURE(procedurename)”调用中使用的名称。如果没有,那么就没有存储过程(但只有一批T-SQL语句),显然,就不能使用“CommandType=StoredProcedure”

0
Salim Proctor 回答 1月 前

这是通过反射执行带参数和不带参数的存储过程的代码。

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;

    }