从Access数据库中删除多行

saf*_*afi 0 c# arrays ms-access

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

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

问题是:以下是删除所有记录的代码,与条件中的位置无关.

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();                                  }`
Run Code Online (Sandbox Code Playgroud)

Dav*_*son 6

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

string [] a = {"" 'a.jpg', 'b.jpg', 'c.jpg' "}
Run Code Online (Sandbox Code Playgroud)

首先,你有两个"在一开始,应该只有一个.

string [] a = {" 'a.jpg', 'b.jpg', 'c.jpg' "}
Run Code Online (Sandbox Code Playgroud)

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

a[0] = "'a.jpg', 'b.jpg', 'c.jpg'";
Run Code Online (Sandbox Code Playgroud)

然后你对这个做一个foreacharly ony执行一次导致这个查询的foreach:

delete from table1     where name not in ('a.jpg', 'b.jpg', 'c.jpg')
Run Code Online (Sandbox Code Playgroud)

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

a[0] = 'a.jpg';
a[1] = 'b.jpg';
a[1] = 'c.jpg';
Run Code Online (Sandbox Code Playgroud)

这将在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')
Run Code Online (Sandbox Code Playgroud)

在第二个之后,表格将为空.

你应该试试这个:

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(); 
Run Code Online (Sandbox Code Playgroud)

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

delete from table1     where name not in ('a.jpg', 'b.jpg', 'c.jpg')
Run Code Online (Sandbox Code Playgroud)

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

您可以将列表作为数组循环遍历.

List<string> names = new List<string>();
//or user var keyword
var names = new List<string>();
Run Code Online (Sandbox Code Playgroud)

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

names.Add(filename);
Run Code Online (Sandbox Code Playgroud)

然后为连接:

string allNames = "'" + String.Join("','", names.ToArray()) + "'";
Run Code Online (Sandbox Code Playgroud)

你完成了.

或者你可以使用

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