C# 如何使用LINQ调用具有INSERT的存储过程?

C# 如何使用LINQ调用具有INSERT的存储过程?,c#,sql-server,linq,stored-procedures,linq-to-sql,C#,Sql Server,Linq,Stored Procedures,Linq To Sql,是否有任何可能的方法来执行非查询,而不必将其分配给LINQ to SQL类 假设我有这个过程,并且仅当Town\u Name(唯一约束)不存在时,我才想INSERT。否则,执行更新。当通过SQL Server执行此过程时,该过程运行良好并完成了任务。但是,我无法通过C代码执行它 我试图避免使用SQL客户端,作为我课程的一部分,我的小应用程序必须能够使用LINQ选择、插入/更新和删除数据 我所采取的方法总是导致0行受影响 // Call Procedure. db.P_SaveClient("00

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

假设我有这个过程,并且仅当
Town\u Name
(唯一约束)不存在时,我才想
INSERT
。否则,执行
更新
。当通过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
我找到了一些教程:


您正在寻找要在SQL中执行的合并语句,可以通过存储过程调用该语句。这将允许您根据是否找到它来插入或更新。它甚至可以返回插入的记录的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
有关语法和更多示例,请参见此处:

旁注:存储过程不应使用
sp
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!请注意,
UPDATE
不会执行任何操作,因为它会查找具有该城镇名称的城镇,然后将其“更新”为相同名称。如果你想“更改需要传入的城镇名称,将原始名称或ID和新名称作为单独的参数传递。没错,我没有测试此脚本。我在几秒钟内提出这个问题是为了补充我的问题。关于SP,请注意。我忘了T-SQL使用sp_execute、sp_rename等来回答您的问题。不过,您可以使用传统的数据访问方法(
SqlCommand
,等等)或在数据上下文上使用该方法来执行非实体查询。LINQ不能执行非查询吗?我已经尝试了一个merge语句,但它不起作用。我添加了输出并得到了输出的结果,但每当我右键单击表并选择“显示数据”时,即使在刷新之后,插入的数据也不存在。@IsaacHili它在SQL Server中是否正确运行?