Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过客户端应用程序的单个调用从sql server中的表中删除多行_C#_Sql_Sql Server_Sql Server 2008_Table Valued Parameters - Fatal编程技术网

C# 通过客户端应用程序的单个调用从sql server中的表中删除多行

C# 通过客户端应用程序的单个调用从sql server中的表中删除多行,c#,sql,sql-server,sql-server-2008,table-valued-parameters,C#,Sql,Sql Server,Sql Server 2008,Table Valued Parameters,以下是我的要求: 我想删除表中的多行 我有需要在客户端应用程序中删除的所有ID的列表 我只想从我的C#客户端应用程序中打一个电话删除所有这些记录。 我之前的经历: foreach(idList中的var id) { //调用采用id的存储过程 //作为参数并删除记录 } 这是一个问题,因为循环中的每个项目都有一个数据库命中 然后,我开始使用SQL Server 2008新引入的表类型和表值参数作为存储过程 首先在数据库中创建一个表类型,该表类型只有一列(Id类型) 创建接受此新表类型(表值

以下是我的要求:

  • 我想删除表中的多行
  • 我有需要在客户端应用程序中删除的所有ID的列表
  • 我只想从我的C#客户端应用程序中打一个电话删除所有这些记录。
我之前的经历:

foreach(idList中的var id)

{

//调用采用id的存储过程

//作为参数并删除记录

}

这是一个问题,因为循环中的每个项目都有一个数据库命中

然后,我开始使用SQL Server 2008新引入的表类型和表值参数作为存储过程

  • 首先在数据库中创建一个表类型,该表类型只有一列(Id类型)
  • 创建接受此新表类型(表值参数)的新存储过程
  • 在客户机代码中,创建一个包含所有要删除的ID的列表/数据表
  • 对数据库进行一次调用以使用新的存储过程
在客户端代码中,它非常简单,如下所示:

SqlParameter参数=新的SqlParameter()
parameter.SqlDbType=System.Data.SqlDbType.Structured

好的-虽然我实现了我设定的目标,但这绝对不适用于2008年之前的SQL server版本

因此,我所做的是引入了一种回退机制:

  • 我引入了一个存储过程,它接受以逗号分隔的id值
  • 我的客户机代码将创建这种逗号分隔的ID,然后简单地将其传递给新的存储过程
  • 然后,存储的进程将拆分所有这些ID,然后逐个调用delete
  • 因此,在某种程度上,即使是在2008年之前的SQL Server版本上,我也实现了我设定的目标:只需点击一次数据库即可删除多行。
但我不相信我采取的最后一种方法——在互联网上快速搜索并没有发现什么

那么,有人能告诉我,我使用逗号分隔的ID和所有ID做的事情是否正确。
在已知ID的情况下,通过一次数据库点击从客户端应用程序中删除多条记录的通常最佳做法是什么


提前感谢。

如果您有一个以列分隔的值列表,比如@list,您可以使用此
删除
语句执行您想要的操作:

delete from t
where ','+@list+',' like '%,'+cast(t.id as varchar(255))+',%'
这是用字符串操作模拟
表达式中的


缺点是这需要一个完整的表扫描。它不会在id上使用索引。

如果您有一个以列分隔的值列表,比如@list,您可以使用此
删除
语句执行您想要的操作:

delete from t
where ','+@list+',' like '%,'+cast(t.id as varchar(255))+',%'
这是用字符串操作模拟
表达式中的


缺点是这需要一个完整的表扫描。它不会在id上使用索引。

与其在代码中构建SQL字符串,不如看ORM(对象关系映射器),比如or。

与其在代码中构建SQL字符串,不如看ORM(对象关系映射器),例如or.

hi,您只需将列表中的所有值与delemeter连接起来,如下所示1,2,3,4,5

以下是删除多行的示例存储过程

create PROCEDURE deleteusers  --deleteusers '1,2,3,4'
    -- Add the parameters for the stored procedure here
    @UsersIds varchar(max)

AS
BEGIN
declare @abc varchar(max)
set @abc='delete from users where userid in('+@UsersIds+')'
exec(@abc)
END
GO

它将删除userid为1,2,3,4的用户。您只需将列表中的所有值与delemeter连接起来,如下所示1,2,3,4,5

以下是删除多行的示例存储过程

create PROCEDURE deleteusers  --deleteusers '1,2,3,4'
    -- Add the parameters for the stored procedure here
    @UsersIds varchar(max)

AS
BEGIN
declare @abc varchar(max)
set @abc='delete from users where userid in('+@UsersIds+')'
exec(@abc)
END
GO

它将删除用户ID为1,2,3,4的用户。此处列出的动态SQL选项可能是您的最佳选择,但只是为了给您多一个选项

CREATE PROCEDURE deleteusers  --deleteusers '1,2,3,4'
-- Add the parameters for the stored procedure here
@UsersIds varchar(max)

CREATE TABLE #DeleteUsers (UserId Int)

-- Split @UserIds and populate into the #DeleteUsers temp table

DELETE FROM Users WHERE UserId IN (SELECT UserId FROM #DeleteUsers)

这里列出的动态SQL选项可能是您的最佳选择,但只是给您多一个选项

CREATE PROCEDURE deleteusers  --deleteusers '1,2,3,4'
-- Add the parameters for the stored procedure here
@UsersIds varchar(max)

CREATE TABLE #DeleteUsers (UserId Int)

-- Split @UserIds and populate into the #DeleteUsers temp table

DELETE FROM Users WHERE UserId IN (SELECT UserId FROM #DeleteUsers)
您可以发送一个包含逗号分隔符或其他字符(用于拆分)的字符串,以从C#end发送ID。
创建过程删除用户
(
@ids nvarchar(最大值)
)
作为
开始
声明@pos bigint、@count int、@id varchar(max)、@I int、@Spos int
设置@Spos=1
设置@I=1
设置@count=len(@ids)-len(替换(@ids,,,,“”))
while(@I
您可以发送一个包含逗号分隔符或其他字符(用于拆分)的字符串,以从C#end发送ID。
创建过程删除用户
(
@ids nvarchar(最大值)
)
作为
开始
声明@pos bigint、@count int、@id varchar(max)、@I int、@Spos int
设置@Spos=1
设置@I=1
设置@count=len(@ids)-len(替换(@ids,,,,“”))

while(@i)您的delete语句是什么样子的?delete from tableName where id=@rowId。@rowId是在拆分逗号分隔的值后强制转换单个字符串后创建的整数。您必须使用存储过程的原因是什么?换句话说,从id位于(1,2,3,5,20,25,50)SQL语句,并直接执行它?但如果要在中使用WHERE id,则必须传递整数值,无需将值强制转换为字符串@Abey@Dan-Metheus,NetStarter-是()子句看起来很简单,但是想象一下我必须在客户端代码中进行的所有sql字符串连接。我不认为这是一种非常简洁的方法—容易出错和维护噩梦。您的delete语句是什么样子的?delete from tableName,其中id=@rowId。@rowId是在强制转换单个s后创建的整数拆分逗号分隔值后的字符串是否有使用存储过程的原因?换句话说,从id位于(1,2,3,5,20,25,50)中的表中构建常规的DELETE*有什么问题SQL语句并直接执行它?但如果您想在中使用WHERE id,则必须传递整数值,而无需将值强制转换为字符串@Abey@Dan-Metheus,NetStarter-是的,WHERE ID IN()子句看起来很简单,但是imagi