如何使用LINQ使用INSERT调用存储过程?

时间:2016-01-18 19:43:28

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

是否有任何可能的方法来执行非查询而不必将其分配给LINQ to SQL类?

我们说我有这个程序,只有当INSERT(UNIQUE CONSTRAINT)不存在时才想Town_Name。否则,执行UPDATE。此过程运行良好,并通过SQL Server执行该作业。但是,我无法通过C#代码执行它。

我试图避免使用SQL客户端,作为课程的一部分,我的小应用程序必须能够使用LINQ选择,插入/更新和删除数据。

我采取的方法总是导致0行受影响。

// Call Procedure.
db.P_SaveClient("000000001M", "Test", "Dummy", null, "+35699999999");

-- Procedure to be executed.
CREATE PROCEDURE        Appointment.SaveClient
                        (
                            @id NVARCHAR(10), 
                            @firstName NVARCHAR(35), 
                            @lastName NVARCHAR(35), 
                            @tel NVARCHAR(12), 
                            @mob NVARCHAR(12)
                        )
AS
BEGIN

    DECLARE @clientCount TINYINT

    SELECT      @clientCount = COUNT(Client_ID)
    FROM        Appointment.Client
    WHERE       Client_ID = @id

    IF @clientCount = 0
        BEGIN
            INSERT INTO     Appointment.Client
            VALUES          (
                                @id
                                , @firstName
                                , @lastName
                                , @tel
                                , @mob
                            )
        END
    ELSE
        BEGIN
            UPDATE          Appointment.Client
            SET             Client_ID = @id
                            , First_Name = @firstName
                            , Last_Name = @lastName
                            , Telephone = @tel
                            , Mobile = @mob
        END

END

我发现了一些教程:

1 个答案:

答案 0 :(得分:1)

您正在寻找在SQL中执行的Merge语句,您可以通过存储过程调用它。这将允许您根据是否找到它来插入或更新。它甚至可以返回插入的记录的ID,这可以为您节省另一个查询。

Merge Town t
using ( select @Town_Name as 'Town_Name') 
src on (src.Town_Name = t.Town_Name )
when NOT MATCHED then
insert (Town_Name) values (src.Town_Name)
output INSERTED.Town_ID

请参阅此处了解语法和更多示例: https://msdn.microsoft.com/en-us/library/bb510625.aspx