[英]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.