我对C#很陌生,我只是将编码作为我的爱好之一。
我尝试使用Visual Studio和Access数据库开发独立的Windows应用程序。 我在如何访问数据库方面遇到了一些困难。 Project是Access数据库中的表,projectname和path是项目表中的列。
我试图读取某个路径中的文件夹名称,并将文件夹的名称和路径写入我的表格。
如何比较和插入仅创建的新文件夹?
这在我的插入语法中显示错误!
string[] files = Directory.GetDirectories(@"C:\\SomePath\\Project_1\\Project_1\\Resources");
foreach (string file in files)
{
string name = new DirectoryInfo(file).Name;
String Root = Path.GetFullPath(file);
connection_2.Open();
OleDbCommand ListWrite = new OleDbCommand();
ListWrite.Connection = connection_2;
ListWrite.CommandText= "insert into Project (projectname,path) values ('" + name + "','" +Root+ "') where'"
+ name + "' != projectname ";
ListWrite.ExecuteNonQuery();
connection_2.Close();
}
答案 0 :(得分:2)
insert命令不允许where语句使用它。
您需要在表中查询每个目录名称。如果查询结果不为空,则表中已存在特定目录名。否则,您可以使用插入插入新名称。
我建议为该检查编写一种新方法:
public bool DoesFolderAlreadyExistInTable(string folder_name, string path, OleDbConnection connection)
{
using (var ListWrite = new OleDbCommand("select count(*) as c from Project where name=@name and path=@path", connection)) {
ListWrite.Parameters.AddWithValue("@name", folder_name);
ListWrite.Parameters.AddWithValue("@path", path);
var result = ListWrite.ExecuteReader();
return result.Read() && result.GetInt32(0) > 0;
}
}
答案 1 :(得分:0)
您只需在where
之后留一个空格:
..where '...
但是,没有SQL注入等问题的最佳解决方案是使用参数:
ListWrite.CommandText= "insert into Project (projectname,path) values (@name, @path)";
ListWrite.Parameters.Add("@name",SqlDbType.NVarChar).Value = name;
ListWrite.Parameters.Add("@path",SqlDbType.NVarChar).Value = Root;
另请注意,where
子句在insert语句中没有任何意义。您必须从代码处理它或在projectname
列上添加唯一约束。
答案 2 :(得分:0)
WHERE
子句在insert语句中无效。我假设你试图做的是防止重复的项目名称。在SQL Server中可以这样做的一种方法如图所示,我已经假设它在Access中也是有效的,但事实并非如此。
<强> SQL 强>
INSERT INTO Project (projectname, path)
SELECT DISTINCT 'yourpath', 'yourroot'
FROM Project
WHERE NOT EXISTS (SELECT projectname FROM Project WHERE projectname = 'yourpath')
<强> C#强>
ListWrite.CommandText= "insert into Project (projectname,path) select distinct '" + name + "','" + Root + "') from Project where not exists (select projectname from Project where projectname = '" + name + "'";
正如LosWochos和apomene所指出的那样,你也应该研究parameterized SQL。