【问题标题】:c# .net How to use a stored procedure?c# .net 如何使用存储过程?
【发布时间】:2018-01-13 20:29:03
【问题描述】:

我正在使用 Visual Studio 2017,创建了一个 C# .NET Web 服务。我在我的模型中创建了一个函数,我想使用存储过程进行 SQL 插入。问题是我得到了错误:

找不到存储过程“createEmployee”

我必须在其他地方定义过程“createEmployee”吗?代码如下:

public string create()
{

    using (SqlConnection mConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString))
    {
        using (SqlCommand mCommand = new SqlCommand("createEmployee", mConnection))
        {

            mCommand.CommandType = CommandType.StoredProcedure;

            mCommand.Parameters.AddWithValue("@name", Name);
            mCommand.Parameters.AddWithValue("@surname", Surname);
            mCommand.Parameters.AddWithValue("@phone", Phone);
            mCommand.Parameters.AddWithValue("@gender", Gender);
            mCommand.Parameters.AddWithValue("@salary", Salary);
            mCommand.Parameters.AddWithValue("@country", Country);

            try
            {
                mConnection.Open();
                mCommand.ExecuteNonQuery();
                return "success";
            }
            catch (SqlException e)
            {
                return e.Message.ToString();
            }

        }
    }

}

【问题讨论】:

  • 您需要在数据库服务器上创建过程 - 您这样做了吗?
  • @PatrickArtner 这是我的第一个 C# .Net,我对此感到困惑。所以为了这个工作,我是否还必须执行 SQL“创建过程 createEmployee”?
  • 我假设您已经在 db 中创建了 Sql 过程,所以不,您不必在 c# 代码中运行任何“创建过程”。也许您需要以某种方式限定名称?这样的“dbo.myDb.CreateEmproee”。这可能取决于连接字符串值
  • Storedprocedure 是写在数据库中的代码块,并从您的程序中调用(正如您尝试做的那样)。您需要使用适当的管理工具(如 Sql Server Management Studio)在数据库上创建存储过程,您甚至可以直接从代码中创建它们。但只有在它们存在于数据库中之后,您才能从代码中调用它们

标签: c# asp.net sql-server stored-procedures


【解决方案1】:

您需要启动 Sql Server Management Studio,选择您的数据库并打开一个新的查询编辑器。然后你可以粘贴创建 StoredProcedure 的代码

CREATE PROCEDURE [dbo].[createEmployee]
    @name nvarchar(200),
    @surname nvarchar(200),
    @phone nvarchar(100),
    @gender nvarchar(1),
    @salary decimal(18,2),
    @country nvarchar(100)
AS
INSERT INTO employees (name, surname, phone, gender, salary, country) 
     VALUES (@name, @surname, @phone, @gender, @salary, @country)

这当然有点武断,因为我既不知道列的确切名称也不知道文本列的确切数据类型和大小。

请注意,虽然存储过程提供了更好的性能并允许 DBA 优化和保护数据库访问,但它们通常会产生管理负担,在将它们用于您的解决方案时应该考虑这一点。
例如,如果您的客户没有熟练的 IT 团队,那么当您需要更新数据库时,您可能会因为向表中添加了新字段而遇到麻烦。如果写得好,管理嵌入 sql 文本的 CRUD 操作的代码维护起来可能会更麻烦。

【讨论】:

    【解决方案2】:

    您可以使用 Sql DDL 插入到您的表中,您不需要为此使用存储过程:(代码近似)

    using (SqlConnection mConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString))
        {
            using (SqlCommand mCommand = new SqlCommand(@"
    
                INSERT INTO _input_your_tables_name_here 
                            (name, surname, phone, gender, salary, country) 
                     VALUES (@name, @surname, @phone, @gender, @country)", mConnection))
    
            {
    
                // mCommand.CommandType = CommandType.StoredProcedure;
    
                mCommand.Parameters.AddWithValue("@name", Name);
                mCommand.Parameters.AddWithValue("@surname", Surname);
                mCommand.Parameters.AddWithValue("@phone", Phone);
                mCommand.Parameters.AddWithValue("@gender", Gender);
                mCommand.Parameters.AddWithValue("@salary", Salary);
                mCommand.Parameters.AddWithValue("@country", Country);
    
                try
                {
                    mConnection.Open(); // should net be needed, as using takes care of it
                    mCommand.ExecuteNonQuery(); // should return 1 for 1 row created
                    return "success";
                }
                catch (SqlException e)
                {
                    return e.Message.ToString();
                } 
            }
        }
    

    有一个过程可以简化它,如果你曾经调整 SP 来做其他事情,你不需要重新编译你的代码,除非你将新的非默认参数更改为你的 SP。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 2011-05-06
      相关资源
      最近更新 更多