我有一个我创建的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();
}
}
}
}
答案 0 :(得分:3)
来自https://msdn.microsoft.com/en-us/library/0881fz2y(v=vs.110).aspx:
使用SqlParameter构造函数的此重载时请小心 指定整数参数值。因为这个过载需要一个 类型为Object的值,必须将整数值转换为Object 当值为零时键入,如下面的C#示例所示。
Parameter = new SqlParameter("@pname", (object)0);