【问题标题】:How to create stored procedure in C#, then *save* it to SQL Server?如何在 C# 中创建存储过程,然后*保存*到 SQL Server?
【发布时间】:2016-01-24 07:01:18
【问题描述】:

我一直在用头撞墙一段时间。我知道您可以在 C# 代码中创建一个存储过程,这没关系。但我想不通的是,我能否保存那个存储过程,到 SQL Server - 但通过 C# 代码完成?

场景是:我想通过代码创建一个测试数据库,然后我想向新创建的测试数据库(服务器端)添加一个存储过程——同样,所有这些都是通过同一个 C# 代码项目完成的。

【问题讨论】:

  • 为什么不在 SQL 中做呢?

标签: c# sql sql-server stored-procedures


【解决方案1】:

是的,这是可能的。这里我给你一个示例。

public partial class InitialEntities : DbMigration  
{  
public override void Up()  
{  
    CreateStoredProcedure(  
        "dbo.InsertEmployee",  
         p => new  
        {  
            Code = p.String(),  
            Name = p.String(),  
            DepartmentId = p.Int(),  
        },  
        body:  
            @"INSERT [dbo].[EmployeeMasters]([Code], [Name], [DepartmentId])  
        VALUES (@Code, @Name, @DepartmentId)  

        DECLARE @EmployeeId int  
        SELECT @EmployeeId = [EmployeeId]  
        FROM [dbo].[EmployeeMasters]  
        WHERE @@ROWCOUNT > 0 AND [EmployeeId] = scope_identity()  

        SELECT t0.[EmployeeId]  
        FROM [dbo].[EmployeeMasters] AS t0  
        WHERE @@ROWCOUNT > 0 AND t0.[EmployeeId] = @EmployeeId"  
    );  

    CreateStoredProcedure(  
        "dbo.UpdateEmployee",  
        p => new  
        {  
            EmployeeId = p.Int(),  
            Code = p.String(),  
            Name = p.String(),  
            DepartmentId = p.Int(),  
        },  
        body:  
            @"UPDATE [dbo].[EmployeeMasters]  
        SET [Code] = @Code, [Name] = @Name, [DepartmentId] = @DepartmentId  
        WHERE ([EmployeeId] = @EmployeeId)"  
    );  

    CreateStoredProcedure(  
        "dbo.DeleteEmployee",  
        p => new  
        {  
            EmployeeId = p.Int(),  
        },  
        body:  
            @"DELETE [dbo].[EmployeeMasters]  
        WHERE ([EmployeeId] = @EmployeeId)"  
    );  

}  

public override void Down()  
{  
    DropStoredProcedure("dbo.DeleteEmployee");  
    DropStoredProcedure("dbo.UpdateEmployee");  
    DropStoredProcedure("dbo.InsertEmployee");  
}  
}  

没有实体框架

 StringBuilder sbSP = new StringBuilder();

 sbSP.AppendLine("CREATE PROCEDURE [spInsertADAuthorization] @AD_Account varchar(255),@AD_SID varchar(255),@AD_EmailAddress varchar(255),@DateImported datetime,@Active bit AS BEGIN SET NOCOUNT ON; INSERT INTO AD_Authorization (AD_Account, AD_SID, AD_EmailAddress, DateImported, Active) VALUES (@AD_Account,@AD_SID,@AD_EmailAddress,@DateImported,@Active) END");
using (SqlConnection connection = new SqlConnection(ConnectionString))
{

 using (SqlCommand cmd = new SqlCommand(sbSP.ToString(), connection))
                        {
                            connection.Open();
                            cmd.CommandType = CommandType.Text;
                            cmd.ExecuteNonQuery();
                            connection.Close();
                        }
                    }

Creating a stored procedure via C# with entityframework

Creating a stored procedure via C# without entityframework

【讨论】:

  • 绝对是一个更好的答案,虽然这需要 EntityFramework 对吧?
【解决方案2】:

是的。您在字符串中使用通常的 CREATE PROCEDURE 文本,然后通过 SqlCommand 执行它,因为用户当然有权存储过程。阅读this other answer,因为它有一些关于GOUSE 的详细信息,这通常用于创建存储过程(在C# 中会给你带来麻烦)

【讨论】:

  • 问题是如何在 C# 代码中创建 CLR 存储过程,而不是如何通过 C# 代码创建 T-SQL 产品。
  • @FrederikGheysels 引用原始问题:“......然后我可以将该存储过程保存到 SQL Server 上 - 但通过 C# 代码完成吗?”
  • 我以为他指的是CLR存储过程:msdn.microsoft.com/en-us/library/ms131094.aspx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
相关资源
最近更新 更多