使用参数化查询在使用 OldDb 的 Access 中添加比例为 2 的数字类型的列

Use parameterised query to add column of Numeric type with Scale of 2 in Access using OldDb

我正在尝试使用 Oledb 命令在 access 数据库中添加一些列。列的类型不同,如货币(OleDbType.Currency)、带两位小数的浮点数(OleDbType.Numeric)、整数(OleDbType.Integer)等。下面的代码是我用来完成我的任务...但是每次它都显示错误消息说一些...“...字段定义错误...”或者当我有时更改代码时它显示 "Syntax Error in Column Definition .." 等

var insertColumnCommand = @"ALTER TABLE ProductRecordsTable ADD COLUMN [Price]= @ProductPrice, [Shipped(NoS)]= @ProductShippedNumber, [Returned(NoS)]= @ProductReturnedNumber, [Sold(NoS)]= @ProductSoledNumber, [Tax Percentage]= @ProductTaxPercentage";
var con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\MyDatabase.accdb;Jet OLEDB:Database Password= 12345;");
using(con)
{
   var cmd = new OleDbCommand(insertColumnCommand, con);
   if (con.State == ConnectionState.Closed)
       con.Open();
   cmd.Parameters.Add("@ProductPrice", OleDbType.Currency);
   cmd.Parameters.Add("@ProductShippedNumber", OleDbType.Integer);
   cmd.Parameters.Add("@ProductReturnedNumber", OleDbType.Integer);
   cmd.Parameters.Add("@ProductSoledNumber", OleDbType.Integer);
   var parameter = new OleDbParameter("@ProductTaxPercentage",OleDbType.Numeric);
       parameter.Precision = 6;
       parameter.Scale = 2;
       cmd.Parameters.Add(parameter);

   cmd.ExecuteNonQuery();
   con.Close();
}

我还想添加选项,例如将 NULL 值放入新添加的列中 table 的现有行中,并且 0(Zero) 将作为 [=18] 插入=]值,对于后面要加的行on.But,cmd.ExecuteNonQuery();之类的太固执了,没能运行成功。

如上面评论所述,在执行 ALTER TABLE 等数据定义语言命令时不能使用参数(在我知道的任何数据库中都是如此)在您的特定情况下,您可以使用 DECIMAL 数据类型对于需要小数位数和精度值且列名和类型之间没有 = 的列。

@"ALTER TABLE ProductRecordsTable 
    ADD COLUMN [Price] DECIMAL (10,2), 
               [Shipped(NoS)] INT, 
               [Returned(NoS)]  INT, 
               [Sold(NoS)] INT, 
               [Tax Percentage]  DECIMAL (6,2)";

然后假设您要将Price 设置为NOT NULL。首先执行查询以将每一行设置为预定义值

"UPDATE ProductRecordsTable SET Price = 0"

现在在列上设置 NOT NULL 值

@"ALTER TABLE ProductRecordsTable ALTER COLUMN [Price] DECIMAL (10,2) NOT NULL"

如果要设置默认值(对于某些列上的新记录

@"ALTER TABLE ProductRecordsTable ALTER COLUMN [Sold (NoS)] INT DEFAULT 0"