使用参数化查询在使用 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"
我正在尝试使用 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"