【问题标题】:Access Database with C#使用 C# 访问数据库
【发布时间】:2018-01-03 12:40:26
【问题描述】:

我对 C# 很陌生,我只是将编码作为我的爱好之一学习。

我正在尝试使用 Visual Studio 和 Access 数据库开发一个独立的 Windows 应用程序。 我在如何访问数据库时遇到了一些困难。 项目是我在 Access 数据库中的表,项目名称和路径是我在项目表中的列。

我正在尝试读取某个路径中的文件夹名称,并将文件夹的名称和路径写入我的表中。

如何仅比较和插入新创建的文件夹?

这表明我的插入语法有错误!

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

【问题讨论】:

  • 您尝试执行的实际结果查询是什么?您应该真正考虑使用查询参数而不是这样的字符串连接。目前,您的代码对 SQL 注入开放,这不仅不安全,而且更容易出错。此外,通常WHERE 子句中的比较将与您所拥有的相反。 column != value,而不是相反。还有,真的是!=吗?或者运营商应该是<>
  • 你可以在这里阅读关于 sql 注入的内容:acunetix.com/websitesecurity/sql-injection
  • 请注意,您应该转义反斜杠或使用 @ 文字,但不能同时使用两者,即 @"C:\SomePath\MyFile""C:\\SomePath\\MyFile。此外,INSERT INTO TABLE() VALUES() WHERE predicate 在我知道的任何 RDBMS 中都不是有效的 SQL。
  • 等等,INSERT 怎么可能拥有 WHERE?这真的没有意义。您需要在数据中放置一个唯一约束并处理错误,或者在插入之前读取数据以查看其中的内容。

标签: c# sql ms-access


【解决方案1】:

插入命令不允许使用 where 语句。

您需要查询表中的每个目录名称。如果查询的结果不为空,则它的具体目录名称已经存在于表中。否则,您可以使用 insert 插入新名称。

我建议为该检查编写一个新方法:

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;
    }
}

【讨论】:

  • 我也试过了!我很难打开一个连接来读取并打开另一个连接来写入访问数据库
  • 您不需要单独的连接。您可以对两个查询使用相同的连接。
  • 你的解释给了我一些想法,我可以做到!
  • 因为我不是电脑程序员!我仍然试图理解你的陈述。绝对现在我有办法搜索它!非常感谢
  • 老实说,我并不完全理解您的代码,但我知道如何使用它并且它现在可以工作了!我觉得我现在完成了一些事情!非常感谢(Y)
【解决方案2】:

你只需要在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 子句在插入语句中没有任何意义。您必须从代码中处理它或在 projectname 列上设置唯一约束。

【讨论】:

  • @DownVoter,我非常感谢您证明否决票的合理性
  • 你一直在编辑,所以我一直在等着看你最后的结果。但这不是空格问题,您的有关 SQL 注入的 cmets 肯定是最佳实践,但不能解决他的问题。
  • @DerrickMoeller,使用我写的不带 where 子句的查询,我相信可以解决问题。无论如何,我很感激让我知道。感谢您的反馈
【解决方案3】:

WHERE 子句在插入语句中无效。我假设您试图做的是防止重复的项目名称。如图所示,您可以在 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

【讨论】:

    猜你喜欢
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    相关资源
    最近更新 更多