【问题标题】:SQLite not saving recordSQLite 不保存记录
【发布时间】:2012-06-21 23:14:18
【问题描述】:

我有一个名为 ID 的文本框和一个保存按钮。单击保存按钮后,我想简单地将我在文本框中写入的任何内容存储在 SQLite 数据库文件中。

代码正在编译,程序运行没有任何错误,但我没有看到我在同一应用程序下创建的数据库文件 (file1.db) 中保存的任何记录。

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
    private SQLiteConnection sqlcon;
    private SQLiteCommand sqlcmd;
    private SQLiteDataAdapter dataBase;
    private DataSet dataSet = new DataSet();
    private DataTable dataTable = new DataTable();


    public Form1()
    {
        InitializeComponent();
    }

    private void createDataBase()
    {
       dataBase = new SQLiteDataAdapter();
    }

    private void ExecuteQuery(string txtQuery)
    {            
     using (SQLiteConnection sqlcon = new SQLiteConnection("Data Source=file1.db"))
     {
            using (SQLiteCommand sqlcmd = sqlcon.CreateCommand())
            {
                sqlcon.Open();
                sqlcmd.CommandText = txtQuery;
                sqlcmd.ExecuteNonQuery();
            }
        }
    }

    private void createDataTable()
    {
        dataTable = new DataTable();
        string txtQuery1 = "CREATE TABLE RECORDS ( ID varchar(255))";
        ExecuteQuery(txtQuery1);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string txtQuery2 = "INSERT INTO RECORDS (ID) VALUES ('" + textBox1.Text + "')";
        ExecuteQuery(txtQuery2);
    }

【问题讨论】:

    标签: c# sqlite


    【解决方案1】:

    几件事。

    首先,我看不到您将查询实际传递给ExecuteQuery 方法的位置。您需要修改您的按钮单击方法,如下所示:

    protected void button1_Click(object sender, EventArgs e)
    {
      string txtQuery = "INSERT INTO RECORDS ID VALUES  ('" + textBox1.Text + "')";
      ExecuteQuery(txtQuery);
    }
    

    其次,查询本身看起来很奇怪。通常结构类似于

    INSERT INTO RECORDS(ID) VALUES('myvalue')
    

    你试过直接执行吗?

    最后,我强烈建议你重写这个并去掉你的全局连接和命令变量。除了不好的做法之外,您所拥有的可能会泄漏内存并通常会导致其他问题。任何实现 IDisposable 的东西,例如 SQLiteConnection 和 SQLiteCommand 都应该包含在 using 子句中。例如:

    using (SQLiteConnection conn = new SQLiteConnection("conn string")) {
      using (SQLiteCommand cmd = conn.CreateCommand()) {
        sqlcmd.CommandText = txtQuery;
        sqlcmd.ExecuteNonQuery();    
      }
    }
    

    这将在每个查询运行后自动清理。此外,由于连接池,它就像您使用全局变量来缓存它们一样快。最后,如果发生错误,您不必担心内存泄漏。

    【讨论】:

    • +1。很好 - 我发现了无效的 SQL,但错过了调用 ExecuteQuery 的失败,直到我看到其他人发布了答案。 :-)
    • 嗨,克里斯。我已经修改了代码并添加了您指出的所有内容。除了现在,它在 sqlcmd.ExecuteNonQuery(); 中给出了一个错误;行,通过告诉不存在这样的“记录”表。我在执行查询方法之前粘贴了方法 createdatabase 和 createdatatable ......你指出问题了吗?谢谢
    • 没关系,我已经解决了。但是,我看不到 file1.db 文件中保存的实际记录。是真的得救还是我看错地方了?谢谢!
    • 我已经添加了一些代码来制作代码,请您修改一下,看看为什么我在 file1.db 中没有得到任何东西?
    • 什么叫createDataTable?我没有看到任何真正这样做的东西。另外,您的 exec 查询是否出错?
    【解决方案2】:

    您没有执行查询。试试这个:

    private void button1_Click(object sender, EventArgs e)
    {
      string txtQuery = "INSERT INTO RECORDS ID VALUES    ('" + textBox1.Text + "')";  
      ExecuteQuery(txtQuery);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 2012-06-03
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多