【问题标题】:insert data to SQLite with button_click in C#在 C# 中使用 button_click 将数据插入 SQLite
【发布时间】:2015-01-28 03:39:58
【问题描述】:

我想用我的 WPF 项目向 SQLite 插入数据,我希望在单击按钮后,我可以将数据保存到 SQLite,这是我的代码。

    private void AddToDB_Click(object sender, RoutedEventArgs e)
    {
        sqlite_Conn = new SQLiteConnection("Data Source=database.db;Version=3;New=True;Compress=True;");

        sqlite_Conn.Open();

        sqlite_Cmd = sqlite_Conn.CreateCommand();

        sqlite_Cmd.CommandText = "CREATE TABLE test (id integer primary key, text varchar(100));";

        sqlite_Cmd.ExecuteNonQuery();

        sqlite_Cmd.CommandText = "INSERT INTO test (id, text) VALUES (1,'Test Text 1');";

        sqlite_Cmd.ExecuteNonQuery();

        sqlite_Cmd.CommandText = "SELECT * FROM test";

        sqlite_DataRdr = sqlite_Cmd.ExecuteReader();

        while (sqlite_DataRdr.Read())
        {
            System.Console.WriteLine(sqlite_DataRdr["text"]);
        }

        sqlite_Conn.Close();
    }

我的问题是,无论我点击多少次按钮,它只会存储1个数据,我认为问题是因为我每次点击按钮后都会创建一个新表,所以我改变了我的代码到:

        if (!created)
        {
            sqlite_Cmd.CommandText = "CREATE TABLE test (id integer primary key, text varchar(100));";
            sqlite_Cmd.ExecuteNonQuery();
            created = true;
        }

但更糟的是,它只能成功执行1次,第二次按下按钮插入数据时,程序会停在

sqlite_Cmd.ExecuteNonQuery(); 

之后

sqlite_Cmd.CommandText = "SELECT * FROM test";

并显示 {"no such table: test"} 错误。

有没有人有什么好主意来解决这个问题?非常感谢!

【问题讨论】:

  • New=True???我想知道这是什么...
  • @LasseV.Karlsen 不错,它重新创建了数据库。
  • id 是主键,但您要插入具有相同 id 的多行,因此任何后续插入都将由于唯一性约束而失败。
  • @LasseV.Karlsen 哎呀!那是我的错……对不起,我的粗心,谢谢你的提醒!在将“New”更改为 False 并注释 sqlite_Cmd.CommandText = "CREATE TABLE test (id integer primary key, text varchar(100));"; 后我已经解决了它sqlite_Cmd.ExecuteNonQuery();非常感谢!!
  • @UlugbekUmirov 感谢您的提醒!那是我的错,而你让它变得更加明显。非常感谢!

标签: c# sqlite database-table


【解决方案1】:

过去我主要处理 SQL 和 MySQL,但是这两者都需要您为要传递的每个命令创建单独的 SQLCommand。

请尝试以下方法:

    sqlite_Conn = new SQLiteConnection("Data Source=database.db;Version=3;New=True;Compress=True;");

        sqlite_Conn.Open();
        sqlite_CreateCmd = new SQLiteCommand();
        sqlite_InsertCmd = new SQLiteCommand();
        sqlite_QueryCmd = new SQLiteCommand();
        sqlite_CreateCmd.Connection = sqlite_Conn;
        sqlite_InsertCmd.Connection = sqlite_Conn;
        sqlite_QueryCmd.Connection = sqlite_Conn;
        var sqlite_CreateTran = sqlite_Conn.BeginTransaction();
        var sqlite_InsertTran = sqlite_Conn.BeginTransaction();
        sqlite_CreateCmd.Transaction = sqlite_CreateTran;
        sqlite_InsertCmd.Transaction = sqlite_InsertTran;
        sqlite_CreateCmd.CommandText = "CREATE TABLE test (id integer primary key, text varchar(100));";
        sqlite_InsertCmd.CommandText = "INSERT INTO test (id, text) VALUES (1,'Test Text 1');";
        sqlite_QueryCmd.CommandText = "SELECT text FROM test";
        sqlite_CreateCmd.ExecuteNonQuery();
        sqlite_InsertCmd.ExecuteNonQuery();
        sqlite_DataRdr = sqlite_QueryCmd.ExecuteReader();
        sqlite_CreateTran.Commit();
        sqlite_InsertTran.Commit();
        System.Console.WriteLine(sqlite_QueryCmd.ExecuteScalar());
        sqlite_Conn.Close();

【讨论】:

  • 谢谢你的回答,我试过了,还是不行。逻辑完全一样,不是吗?我希望有一种方法可以将“打开连接”部分与“插入”部分分开,我仍然可以像往常一样插入数据。
  • 从这里查看答案:link。我相信您必须首先为事务创建变量,然后为每个命令分配一个事务。
【解决方案2】:

我想通了! 我将New 属性更改为False 并消除

sqlite_Cmd.CommandText = "CREATE TABLE test (id integer primary key, text varchar(100));";

sqlite_Cmd.ExecuteNonQuery();

然后可以正确插入数据。但是,因为我删除了将创建表的部分,所以必须在执行此程序之前创建表。感谢您的帮助!

【讨论】:

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