繁体   English   中英

从Access数据库中删除多行

[英]Deleting Multiple Rows from an Access Database

我想使用数组从访问数据库中删除多个记录。 该数组是从文件名动态加载的。

然后我查询数据库,看看数据库列值是否与数组值匹配,如果不匹配则删除它,如果匹配则不删除它。

问题是:以下是删除所有记录的代码,无论Condition中的位置如何。

arrays = Directory.GetFiles(sdira, "*", SearchOption.AllDirectories).Select(x => Path.GetFileName(x)).ToArray();
    fnames.AddRange(arrays); 

    here I have use also for loop but that also didnt help me out :( like for(int u = 0; u < arrays.length; u++) { oledbcommand sqlcmd = new oledbcommand ("delete from table1 where name not in ("'+arrays[u]+"')",sqlconnection);
   I am using this one currently foreach(string name in arrays)
   {
       OleDbCommand sqlcmd = new OleDbCommand("delete from table1 where name not in ('" + name + "')", sqlconnection);
       sqlcmd.ExecuteNonQuery();                                  }`

一个问题是您的代码令人困惑。

string [] a = {"" 'a.jpg', 'b.jpg', 'c.jpg' "}

首先,一开始您有双“,应该是一个。

string [] a = {" 'a.jpg', 'b.jpg', 'c.jpg' "}

然后创建了一个包含一个元素的字符串数组,

a[0] = "'a.jpg', 'b.jpg', 'c.jpg'";

然后,您对此进行一次foreach,实际上只有一次执行后才导致此查询:

delete from table1     where name not in ('a.jpg', 'b.jpg', 'c.jpg')

但是当您动态加载数组时,您可能会得到此数组

a[0] = 'a.jpg';
a[1] = 'b.jpg';
a[1] = 'c.jpg';

这将在foreach中执行3次,导致以下3个查询

delete from table1     where name not in ('a.jpg')
delete from table1     where name not in ('b.jpg')
delete from table1     where name not in ('c.jpg')

在第二个表之后,该表将为空。

您应该尝试以下方法:

string[] names = { "a.jpg", "b.jpg","c.jpg","j.jpg" };
string allNames = "'" + String.Join("','", names) + "'";

OleDbCommand sqlcmd = new OleDbCommand("delete from table1  where name not in (" + allNames + ")", sqlconnection); 
sqlcmd.ExecuteNonQuery(); 

动态创建名称的原因是,这将导致以下查询与您的测试匹配:

delete from table1     where name not in ('a.jpg', 'b.jpg', 'c.jpg')

动态填充数组的首选方法是使用列表,因为纯数组的大小是固定的,任何更改都需要创建一个新数组。

您可以像数组一样循环遍历列表。

List<string> names = new List<string>();
//or user var keyword
var names = new List<string>();

然后,只需使用add方法添加元素,然后根据需要循环即可。

names.Add(filename);

然后进行串联:

string allNames = "'" + String.Join("','", names.ToArray()) + "'";

您完成了。

或者你可以使用

string[] filePaths = Directory.GetFiles(@"c:\MyDir\", "*.jpg");
string[] names = filePaths.ToList().ConvertAll(n => n.Substring(n.LastIndexOf(@"\") + 1)).ToArray();

发表我的评论作为答案

您的字符串没有读入4个条目,而是读了一个

string names = " 'a.jpg', 'b.jpg','c.jpg','j.jpg' ";

它应该是

string[] names = { "a.jpg", "b.jpg","c.jpg","j.jpg" };

在您的每个人的计数为1之前,现在应该有4的计数与实际值

编辑:在这个解决方案中,我必须付出很多努力,但我必须承认,但是如果您想进行动态输入,则可以执行以下操作:

    string name = " 'a.jpg', 'b.jpg','c.jpg','j.jpg' ";
    string[] names = name.Split(',').Select(x => x.Trim(' ').Trim('\'')).ToArray();

如果我得到更改,稍后会更新,因为修剪不是很好的atm

对于填充它,如果您希望它可枚举,则示例可能类似于

IEnumerable<string> filelocations = Directory.GetFiles(sourceDirectory, "*", SearchOption.AllDirectories).Select(x => Path.GetFileName(x));

或用于字符串数组

string [] lok = Directory.GetFiles(sourceDirectory, "*", SearchOption.AllDirectories).Select(x => Path.GetFileName(x)).ToArray();

听起来您未正确读取文件或文件为空。 在对数据库运行操作之前,应检查数组以确保其不为空。 如果数组为空,则应删除数据库中的所有内容,因为没有匹配项。

您需要像这样定义数组:

string[] names = { "a.jpg", "b.jpg", "c.jpg", "j.jpg" };

您定义数组的方式它仅包含一个值:

" 'a.jpg', 'b.jpg','c.jpg','j.jpg' "

您注释中的代码将删除所有与第一个文件都不匹配的文件。 那将是所有非“ a.jpg”文件。 下一次迭代将删除所有与“ b.jpg”不匹配的文件,即“ a.jpg”。 这将导致一个空表。 编辑:当您手动执行数组声明时,会生成一个良好的IN子句,但是在获取文件名列表时,不会生成相同的字符串。

您需要在数组上执行联接以为where子句生成单个字符串,从而使where子句包含所有文件。 您的最终where子句应如下所示:

where name not in ('a.jpg','b.jpg','c.jpg','d.jpg')

现在您有:

where name not in ('a.jpg')

...下一次迭代

where name not in ('b.jpg')

另外,请注意IN操作很昂贵,并且数组越长,查询增长越快。

如果您不想创建静态大小的数组,请尝试使用列表

List<string> names = new List<string>();
names.Add("a.jpg");
names.Add("b.jpg");
names.Add("c.jpg");


foreach (string name in names)
{
   OleDbCommand sqlcmd = new OleDbCommand("delete from table1 
   where name not in (" + name + ")", 
   sqlconnection); 
   sqlcmd.ExecuteNonQuery(); 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM