【问题标题】:Microsoft Access Database, Insert, Update and Delete in Visual Studio with C#Microsoft Access 数据库,使用 C# 在 Visual Studio 中插入、更新和删除
【发布时间】:2016-08-25 16:22:08
【问题描述】:

我正在尝试通过 Visual Studio 2015 和 c# 在 Microsoft Access 数据库中的表中插入一行。

场景是:一个名为:QuestionData 的类和一个名为 Question 的类。一张表exams,一张表questions

我的代码是:

public static bool addQuestion(QuestionData quesData)
    {
        if (quesData == null || quesData.question == null) { return false; }
        List<QuestionData> questionsData = new List<QuestionData>();

        string connetionString = null;
        OleDbConnection cnn;
        connetionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=database.mdb;";
        cnn = new OleDbConnection(connetionString);
        try
        {
            string insertCmd = "INSERT INTO questions (exam_id, [name], question_text, withImage, question_correctAnswer, answer_1, answer_2, answer_3, answer_4) VALUES (@exam_id, @name, @question_text, @withImage, @question_correctAnswer, @answer_1, @answer_2, @answer_3, @answer_4)";
            OleDbCommand cmd = new OleDbCommand(insertCmd);

            cmd.Parameters.Add("@exam_id", OleDbType.Numeric).Value = quesData.examId;
            cmd.Parameters.Add("@name", OleDbType.LongVarChar).Value = quesData.question.getName();
            cmd.Parameters.Add("@questionText", OleDbType.LongVarChar).Value = quesData.question.getQuestionText();
            cmd.Parameters.Add("@withImage", OleDbType.Boolean).Value = quesData.question.isImageEnabled();
            cmd.Parameters.Add("@question_CorrectAnswer", OleDbType.Numeric).Value = quesData.question.getCorrectAnswer();
            cmd.Parameters.Add("@answer_1", OleDbType.LongVarChar).Value = quesData.question.getAnswer(0);
            cmd.Parameters.Add("@answer_2", OleDbType.LongVarChar).Value = quesData.question.getAnswer(1);
            cmd.Parameters.Add("@answer_3", OleDbType.LongVarChar).Value = quesData.question.getAnswer(2);
            cmd.Parameters.Add("@answer_4", OleDbType.LongVarChar).Value = quesData.question.getAnswer(3);

            cmd.Connection = cnn;
            cnn.Open();
            int result = cmd.ExecuteNonQuery();
            cnn.Close();

            return true;
        }

        catch (Exception ex)
        {
            MessageBox.Show("Exception: \n Source: " + ex.Source + "\n Message: " + ex.Message);
            cnn.Close();
            return false;
        }
    }

一切正常,没有编译或运行时错误,cmd.ExcuteNonQuery(); 行返回正值(1),但数据库文件没有任何反应。但是Read Query 工作正常并且可以正常工作。

我搜索了谷歌,并尝试了互联网上的每一个解决方案,但没有任何改变结果。

感谢任何帮助以及解决问题的任何指南。

【问题讨论】:

  • 将第一部分改成这样的字符串 insertCmd = "INSERT INTO questions ([exam_id], [name], [question_text], [withImage], [question_correctAnswer], [answer_1], [answer_2], [answer_3],[answer_4])
  • 您确定您查看的是正确的database.mdb 文件吗?我怀疑该应用程序正在写入与您正在检查更改的文件不同的文件。要消除任何歧义,请在连接字符串中使用完整路径。
  • @sstan 我不这么认为,因为我在所有函数中都使用相同的连接字符串,并且在选择函数和通过 Access 软件编辑调试文件夹中的数据库时它可以工作,确实会影响关于阅读其他功能。所以我认为它只是一个数据库。有什么我错过的吗?
  • 想不出别的了。 cmd.ExecuteNonQuery() 返回 1 的事实意味着 insert 肯定有效。所以,不管问题是什么,我认为它不在你的代码中。
  • 感谢@sstan 我正在搜索,如果我发现任何可以帮助他人的东西,我会更新问题。

标签: c# sql visual-studio ms-access-2010 sql-insert


【解决方案1】:

使用 Access 时,参数应标记为“?”。它们不使用名称,而是使用它们添加到参数集合的顺序(仍然需要假名称 :-))

尝试替换

string insertCmd = "INSERT INTO questions (exam_id, [name], question_text, withImage, question_correctAnswer, answer_1, answer_2, answer_3, answer_4) VALUES (@exam_id, @name, @question_text, @withImage, @question_correctAnswer, @answer_1, @answer_2, @answer_3, @answer_4)";

string insertCmd = "INSERT INTO questions (exam_id, [name], question_text, withImage, question_correctAnswer, answer_1, answer_2, answer_3, answer_4) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";

检查您是否使用固定路径连接到正确的文件。这可能会令人困惑。

顺便说一句,你最好对 Connection 对象使用 using 关键字,当你退出 using 语句时,你将确保它会被正确关闭(正常方式和异常也是如此)。这一点只是一个好的做法,而不是您的案例的错误来源。

using cnn = new OleDbConnection(connetionString)
{
  cnn.open
  //Query the DB
}

【讨论】:

  • 对不起,它不起作用。但是权限有什么关系吗,因为用Access软件执行的时候,每次都请求权限。
  • 好的,让我们开始标准的数据库调试过程。首先尝试在 Access 中编写并执行您的插入查询(使用测试数据),然后将此查询复制到您的应用程序中并尝试执行它(使用相同的测试数据)。当你很好时,你可以将查询调整为动态的(首先使用旧的字符串连接,然后使用参数)。
  • 这也不适用于视觉工作室,我确实将 insertCmd 替换为:INSERT INTO questions (exam_id, name, question_text, withImage, question_correctAnswer, answer_1, answer_2, answer_3, answer_4) VALUES ('1 '、'2'、'A'、'1'、'3'、'B'、'C'、'D'、'E');并评论添加参数块,结果仍然相同!
  • 如果您直接在访问中将其写入查询(以 sql 模式,而不是设计器)中,它是否有效?你确定你打开了正确的 .mdb 文件的连接吗?因为如果“Data Source=database.mdb”是您真正的连接字符串(希望不是),它可能会非常令人困惑。我知道 Visual Studio 在每次启动时都会将 .mdb 文件从项目复制到调试文件夹。如果您不会一直重置数据库,那么在项目之外使用固定路径可能是一个好主意。
  • 谢谢,@MarcoGuignard,是的,它在通过 SQL 编辑器编写时有效,数据库是通过解决方案资源管理器中的 database.mdb 文件打开的,我发现在执行 INSERT 查询后查询表确实得到插入的行,但在关闭它后,记录会丢失。我认为您是对的,我将按照您的建议将路径更改为固定路径,
猜你喜欢
  • 2017-08-18
  • 1970-01-01
  • 2014-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
相关资源
最近更新 更多