从表中删除,并返回未删除的记录

时间:2012-07-23 06:50:06

标签: c# asp.net sql-server sql-server-2008 ado.net

我的SQLSERVER(2008R2)上有一个名为“Clients”的表,它有ClientID和Address。 我想做一个查询/ SP执行以下操作:

  1. 收到地址列表。
  2. 删除包含这些地址的记录。
  3. 返回无法删除的地址列表(未找到行等)。
  4. 返回已删除的行数。
  5. 我的应用程序是基于C#-ASP.NET的应用程序。 我想到了以下解决方案:

    1. 创建一个收到地址列表的SP,然后尝试删除它们,如果无法删除它,则将其添加到某种数组/列表中。 - 我对这个解决方案的问题是我不熟悉SQLSERVER(2008R2)中列表的工作方式。

    2. 使用DataTable,从数据库中选择我需要的数据,然后使用SqlDataAdapter将其删除,并检查通过RowState更改的行。

    3. 我的数据库示例:

      Client ID    Address
      
      111111111  'foo st. 2'
      
      222222222  'foo bld 1'
      
      333333333  'foo rd 22'
      
      444444444  'foo st. 1'
      

      输入示例:

      input list{'foo st. 2','foo bld 1','foo st 22','foo st 1'} - 上面的表中不存在最后两项,所以我希望我的SP(或任何其他解决方法)返回:

      'Deleted rows: 2' //thats not a problem
      'list of the records which weren't removed: {'foo st 22','foo st 1'} //thats a problem..
      

      希望我尽可能地保持清醒。

2 个答案:

答案 0 :(得分:1)

首先,执行DELETE语句:

sql="DELETE FROM TABLENAME where Col1='Something'";

然后执行SELECT语句到未删除的行列表?

 sql="SELECT * FROM TABLENAME where Col1='Something'";

编辑:

List<string> addresses=new List<string>()
{
 "foo st. 2","foo bld 1","foo st 22","foo st 1"
};
List<string> deleted=new List<string>();
List<string> notdeleted=new List<string>();

using(SqlConnection cn=new SqlConnection("connStr"))
 {
  using(SqlCommand cmd=new SqlCommand())
  {
    cmd.CommandText="DELETE from TableName Where Address=@address";
    cmd.Connection=cn;
    cmd.Parameters.Add("@address",SqlDbType.VarChar,50);
    cn.Open();
    for(String address in addresses)
     {
       cmd.Parameters["@address"].Value=address;
       int result=cmd.ExecuteNonQuery();
       if(result!=-1)
        {
          //deleted
          deleted.Add(address);
        }
      else
        {
         //not deleted
         notdeleted.Add(address);
        }
     }
    cn.Close();
   }
 }

答案 1 :(得分:1)

我认为你不能找到sql中的删除语句没有删除哪些项目。首先,您需要一种用逗号分割字符串的方法。我会使用像this question

中建议的表函数

如果你有,那么你需要在删除临时表之前选择,然后删除那里的记录,然后返回丢失的记录:

DECLARE @SplitString TABLE
(
    value varchar(MAX)
)

DECLARE @MissingRecords TABLE
(
    value varchar(MAX)
)


INSERT INTO @SplitString
SELECT  part
FROM    dbo.fSplitString('foo st 22, foo st 1', ',')



SELECT  value
FROM    @SplitString
WHERE   value NOT IN (  SELECT Address
                        FROM TableName
                     )

DELETE  FROM TableName
WHERE   Address IN (SELECT Value FROM @SplitString)

SELECT  *
FROM    @MissingRecords