SQLite 显示"Insufficient Parameters supplied to the command"尽管有足够的参数



我有下面的SQLite表:

CREATE TABLE "Ingredient_Detailed" (
"DETAILED_INGREDIENT_ID"    TEXT,
"INGREDIENT_CODE"   INTEGER NOT NULL,
"BRAND" TEXT NOT NULL,
"INGREDIENT_SOURCE" TEXT NOT NULL,
"UNIT_PRICE"    REAL NOT NULL DEFAULT 0,
"AMOUNT_IN_UNIT"    REAL NOT NULL DEFAULT 0,
"MINIMUM_PRICE_PER_UNIT"    REAL NOT NULL DEFAULT 0,
"QUALITY"   INTEGER NOT NULL DEFAULT 1,
"UNITS_AVAILABLE"   INTEGER NOT NULL DEFAULT 0,
FOREIGN KEY("INGREDIENT_CODE") REFERENCES "Ingredient"("CODE"),
PRIMARY KEY("DETAILED_INGREDIENT_ID")
)

我有一个c#应用程序,我试图插入记录到这个表与以下方法:

public int SaveDetailedIngredient(DetailedIngredient pDetailedIngredient)
{
try
{
using (var conn = new SQLiteConnection(GetConnectionString()))
{
var saveDetailedIngredientCommand = new SQLiteCommand("INSERT INTO INGREDIENT_DETAILED (DETAILED_INGREDIENT_ID, " +
"INGREDIENT_CODE, BRAND, INGREDIENT_SOURCE, UNIT_PRICE, AMOUNT_IN_UNIT, " +
"MINIMUM_PRICE_PER_UNIT, QUALITY, UNITS_AVAILABLE) " +
"VALUES ($pDetailedIngredientId, $pCode, $pBrand, $pSource, $pUnitPrice, $pAmountInUnit, $pPricePerUnit, $pQuality, $pUnitsAvailable)", conn);
pDetailedIngredient.DetailedIngredientCode = pDetailedIngredient.Code + "-" + pDetailedIngredient.Brand + "-" + pDetailedIngredient.IngredientSource;
saveDetailedIngredientCommand.Parameters.AddWithValue("pDetailedIngredientId", pDetailedIngredient.DetailedIngredientCode);
saveDetailedIngredientCommand.Parameters.AddWithValue("pCode", pDetailedIngredient.Code);
saveDetailedIngredientCommand.Parameters.AddWithValue("pBrand", pDetailedIngredient.Brand.Trim().ToUpper());
saveDetailedIngredientCommand.Parameters.AddWithValue("pSource", pDetailedIngredient.IngredientSource.Trim().ToUpper());
saveDetailedIngredientCommand.Parameters.AddWithValue("pUnitPrice,", pDetailedIngredient.UnitPrice);
saveDetailedIngredientCommand.Parameters.AddWithValue("pAmountInUnit", pDetailedIngredient.AmountInUnit);
saveDetailedIngredientCommand.Parameters.AddWithValue("pPricePerUnit", pDetailedIngredient.MinimumUnitPrice);
saveDetailedIngredientCommand.Parameters.AddWithValue("pQuality", pDetailedIngredient.Quality);
saveDetailedIngredientCommand.Parameters.AddWithValue("pUnitsAvailable", pDetailedIngredient.UnitsAvailable);
conn.Open();
return saveDetailedIngredientCommand.ExecuteNonQuery();
}
}
catch (SQLiteException sqlEx)
{
Console.WriteLine(sqlEx.Message);
Console.WriteLine(sqlEx.ErrorCode);
throw sqlEx;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw ex;
}
}

尽管指定了9个字段并提供了9个参数,SQLite仍然抛出一个异常:"未知错误:未充分参数提供给命令"。

我复制并粘贴了参数的名称,以确保其中没有打字错误,但它仍然抛出错误。

我在方法执行期间调试了应用程序,提供的pDetailedIngredient已分配了所有必要的属性值,并且我可以看到命令中的每个参数都被正确地分配了。

我有几个其他的方法来插入数据到其他表,都遵循相同的结构,所以我怀疑这与我的方法的编写方式有关。

我错过了什么吗?我感觉这不是一个正确的错误。

我真的希望我有一个好的答案,"为什么"会发生这种情况。我只能假设"AddWithValue"正在做一些我不知道的事情。然而,在一些来回之后,我想让你尝试一下,看看它是否适合你,就像它对我一样。

所改变的是通过添加如下所示的参数。这在一些测试中一直有效,只有在复制id时才会失败。请让我知道,如果这有助于我与你在某种意义上,在表面上,你的代码看起来很好,我。

saveDetailedIngredientCommand.Parameters.Add("pDetailedIngredientId", DbType.String).Value = pDetailedIngredient.DetailedIngredientCode;
saveDetailedIngredientCommand.Parameters.Add("pCode", DbType.Int32).Value = pDetailedIngredient.Code;
saveDetailedIngredientCommand.Parameters.Add("pBrand", DbType.String).Value = pDetailedIngredient.Brand.Trim().ToUpper();
saveDetailedIngredientCommand.Parameters.Add("pSource", DbType.String).Value = pDetailedIngredient.IngredientSource.Trim().ToUpper();
saveDetailedIngredientCommand.Parameters.Add("pUnitPrice", DbType.Decimal).Value = pDetailedIngredient.UnitPrice;
saveDetailedIngredientCommand.Parameters.Add("pAmountInUnit", DbType.Decimal).Value = pDetailedIngredient.AmountInUnit;
saveDetailedIngredientCommand.Parameters.Add("pPricePerUnit", DbType.Decimal).Value = pDetailedIngredient.MinimumUnitPrice;
saveDetailedIngredientCommand.Parameters.Add("pQuality", DbType.Int32).Value = pDetailedIngredient.Quality;
saveDetailedIngredientCommand.Parameters.Add("pUnitsAvailable", DbType.Int32).Value = pDetailedIngredient.UnitsAvailable;

如果这对你不起作用,请告诉我,我将删除它。

另一个可能导致" command提供的参数不足"的原因误差

如果您使用类似于以下方法以编程方式将数据输入SQLite DB:

  1. 创建一个包含所需属性的类
  2. 实例化类并填充实例
  3. save instance to DB

类属性名和DB列名必须匹配(不包括大小写敏感)。

示例(我使用NuGet Dapper,所以确切的语法可能不同):

public class StartState
{
public string Phase { get; set; }
public string ArgText { get; set; }
public string startTime { get; set; }
}
// in winforms form.cs
private static void SaveStartState()
{
StartState model = new StartState();
{
model.Phase = Terms.Status;
model.ArgText = _tsarg;
model.startTime = starttTime4DB;
DBconnects.SaveState(model);
}
}
// in DBconnects.cs
public static void SaveState(StartState model)
{
using (var dbc = new SQLiteConnection(Connections.SQLiteDB()))
{
dbc.Execute($"insert into {DBtbl.State}(" +
"phase,argText,startTime)" +
" values(" +
"@phase,@argText,@startTime)"
, model);
}
}
// DB Definition
CREATE TABLE 'StartState' (
phase TEXT NOT NULL PRIMARY KEY,
argText TEXT,
startTime TEXT
);

相关内容

最新更新