使用C#访问数据库

时间:2018-01-03 12:40:27

标签: c# sql ms-access

我对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();
}

3 个答案:

答案 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