代码之家  ›  专栏  ›  技术社区  ›  patentfox

将数据集中的更改持久化到sqlite数据库

  •  0
  • patentfox  · 技术社区  · 15 年前

    我是ADO.NET新手。我正在努力将数据集中的更改持久化到sqlite数据库中。

    它有一个“Category”表,其中有3个字段:CategoryID(int)、CategoryName(varchar(100)、Parent(int)。父级可以为空。

    我正试图在数据库中插入新行。我有以下代码。

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.SQLite;
    using System.Text;
    
    namespace QS_Optimized
    {
        class UsingDataset
        {
            static DataSet dataset;
            static SQLiteConnection conn;
    
            static UsingDataset()
            {
                conn = new SQLiteConnection("data source = ..\\sqlitedb_amrit.db");
                dataset = new DataSet("MyDataset");
            }
    
            public static void UpdateFromDB()
            {
                SQLiteDataAdapter sqda = new SQLiteDataAdapter("Select Category.* from Category where Parent = 0", conn);
                sqda.Fill(dataset, "Category");
                //dataset.Tables["Category"].Columns["CategoryID"].AllowDBNull = false;
                //dataset.Tables["Category"].Columns["CategoryName"].AllowDBNull = false;
    
                // Insert command
                SQLiteCommand cmdInsert = new SQLiteCommand();
                cmdInsert.Connection = conn;
                cmdInsert.CommandText = @"Insert into Category('CategoryID','CategoryName','Parent') values" +
                    @"(@id,@name,@parent)";
                cmdInsert.Parameters.Add(new SQLiteParameter("@id",DbType.Int64));
                cmdInsert.Parameters.Add(new SQLiteParameter("@name",DbType.String));
                cmdInsert.Parameters.Add(new SQLiteParameter("@parent",DbType.Int64));
                sqda.InsertCommand = cmdInsert;
    
                // Add Datarows to dataset;
                DataTable tbl = dataset.Tables["Category"];
                DataRow drw = tbl.NewRow();
                drw[0] = 64;
                drw[1] = "TestCategory";
                drw[2] = 0;
                tbl.Rows.Add(drw);
    
                sqda.Update(dataset,"Category");
            }
    
            public static void Main()
            {
                UpdateFromDB();           
            }           
        }
    }
    

    当我执行它时,我得到一个异常:

    Category.Categoryname不能为空

    . 为什么会出现这个错误?我想我没有插入空值

    另外,当我在特定列中允许空值(在数据库中完成更改)时,此代码将插入一个新行

    (64,空,空)

    在数据库的表中。我现在已经有63条记录了

    1 回复  |  直到 15 年前
        1
  •  0
  •   MAW74656    15 年前

    保持简单。只需使用SQLite命令对象。将sql设置为

    插入tablename(col1,col2, col3)值(@val1,@val2,@val3)

    然后将这些值传递到command对象的parameters集合中。这样,您将有一个更轻松的调试时间,因为您可以在运行时查看每个参数值。