SQLiteException约束失败

时间:2016-01-18 12:28:59

标签: c# sqlite

我有一个我创建的SQLite表,它在插入非零数据时工作正常。但是,我需要插入一些零默认值,SQLiteParameter似乎将零值转换为null

有人可以解释为什么我会收到@xxxx3=null而不是@xxxx3=0以及如何修复它。

这似乎适用于任何数字字段(INTEGER / NUMERIC)。

我已经汇总了一个显示问题的简化示例

class Program
    {

        private static List<SQLiteParameter> DefaultSystemParameters()
        {
            List<SQLiteParameter> sp = new List<SQLiteParameter>()
            {
                new SQLiteParameter("@xxxx2", 60),
                //new SQLiteParameter("@xxxx3", 1), // Works fine
                new SQLiteParameter("@xxxx3", 0), // Throws 'System.Data.SQLite.SQLiteException' NOT NULL constraint failed: tblxxxx.xxxx3    
            };

            return sp;
        }

        static void Main(string[] args)
        {
            //Add Nuget package - System.Data.SQLite v 1.0.99
            string baseDir = AppDomain.CurrentDomain.BaseDirectory + AppDomain.CurrentDomain.RelativeSearchPath + "db\\";
            string fileName = "test.db";

            string sqlCreateTable = "CREATE TABLE IF NOT EXISTS tblxxxx (" +
                                        "xxxx1 INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," +
                                        "xxxx2 INTEGER NOT NULL," +
                                        "xxxx3 INTEGER NOT NULL" +
                                        ")";

            string sqlInsert = "INSERT INTO tblxxxx (xxxx2, xxxx3) VALUES (@xxxx2, @xxxx3)";

            if (!Directory.Exists(baseDir))
                Directory.CreateDirectory(baseDir);

            DataTable dt = new DataTable();
            string connectionString = $"Data Source={baseDir + fileName};Version=3;";
            using (var connection = new SQLiteConnection(connectionString))
            {
                connection.Open();
                using (var transaction = connection.BeginTransaction())
                {
                    //CREATE
                    using (SQLiteCommand command = new SQLiteCommand(sqlCreateTable, connection))
                    {
                        command.CommandType = CommandType.Text;
                        command.ExecuteNonQuery();

                        //INSERT
                        command.CommandText = sqlInsert;
                        command.Parameters.AddRange(DefaultSystemParameters().ToArray());
                        command.ExecuteNonQuery();
                    }

                    transaction.Commit();
                }

            }

        }

    }

1 个答案:

答案 0 :(得分:3)

来自https://msdn.microsoft.com/en-us/library/0881fz2y(v=vs.110).aspx

  

使用SqlParameter构造函数的此重载时请小心   指定整数参数值。因为这个过载需要一个   类型为Object的值,必须将整数值转换为Object   当值为零时键入,如下面的C#示例所示。

Parameter = new SqlParameter("@pname", (object)0);