使用十进制参数的数据类型不匹配-OleDb,C#,Access
好的,我正在尝试将程序中更新的私有成员发送到access数据库。但是,每当我运行程序并按下保存按钮时,就会出现“条件表达式中的数据类型不匹配”异常 下面是我正在使用的代码片段。它正在da.Update命令中引发异常。所以我知道这与我的更新命令或参数有关。 我还注释掉了重复的部分,因为我一直试图缩小问题的范围 OLEDB连接conn=新的OLEDB连接(ConnString) 如果去掉注释部分,本质上缩小到这一点:使用十进制参数的数据类型不匹配-OleDb,C#,Access,c#,ms-access,parameterized,oledbdataadapter,C#,Ms Access,Parameterized,Oledbdataadapter,好的,我正在尝试将程序中更新的私有成员发送到access数据库。但是,每当我运行程序并按下保存按钮时,就会出现“条件表达式中的数据类型不匹配”异常 下面是我正在使用的代码片段。它正在da.Update命令中引发异常。所以我知道这与我的更新命令或参数有关。 我还注释掉了重复的部分,因为我一直试图缩小问题的范围 OLEDB连接conn=新的OLEDB连接(ConnString) 如果去掉注释部分,本质上缩小到这一点: OleDbConnection conn = new OleDbConnectio
OleDbConnection conn = new OleDbConnection(ConnString);
string sql = @" SELECT * FROM Account where AccountID = '" + accountName + @"'";
string update = @" UPDATE Account SET
Cash = '@Cash'";
try{
OleDbDataAdapter da = new OleDbDataAdapter();
da.SelectCommand = new OleDbCommand(sql, conn);
AccountDatabaseDataSet ds = new AccountDatabaseDataSet();
da.Fill(ds, "Account");
DataTable dt = ds.Tables["Account"];
dt.Rows[0][1] = cash;
OleDbCommand cmd = new OleDbCommand(update, conn);
cmd.Parameters.Add("@Cash", OleDbType.Decimal, 18, "Cash");
da.UpdateCommand = cmd;
da.Update(ds, "Account");
}
所以,基本上我有一个“Account”表,我想将第二列[1]设置为decimal类型的私有成员变量“cash”。然后我为“@Cash”参数设置参数,其中OleDbType是一个十进制,大小是18,access数据库中的列是“Cash”。最后,我用这个值更新“Account”表
现在我已经尝试将oledbtype中的.Decimal更改为列表中所有可能的类型,但它似乎从来都不起作用,甚至有些异常将其声明为“无法转换为DateTime的Decimal类型”,例如。所以我相信OLEDB类型不是问题所在。我还尝试过修改参数中的大小,但也没有成功
我已经尽我所能解释了这一点,但如果还有其他有助于解决此问题的方法,我会提供。如果您需要更新数据库上的行,请尝试下面的方法
using (OleDbConnection conn = new OleDbConnection(ConnString))
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "UPDATE Account SET Cash=? WHERE AccountID =?";
cmd.Parameters.Add("@p1", OleDbType.Decimal).Value = 3.1416;
cmd.Parameters.Add("@p2", OleDbType.Integer).Value = accountName;
cmd.ExecuteNonQuery();
}
}
- 使用参数,否则您的查询将被sql注入攻击打开
- OLE DB.NET Framework数据提供程序使用带问号(?)的位置参数,而不是命名参数
- 您说它正在抛出异常。您是否尝试捕获异常并更详细地检查它?有时,异常将具有InnerException属性,该属性可以包含复杂对象(如OleDb)引发的错误的更多详细信息。以下是解决我的更新难题的代码,供需要帮助的人参考。这是在Visual Studio 2012中使用MS Access的数据集:
public void UpdateValues(string accountName)
{
OleDbConnection conn = new OleDbConnection(ConnString);
string sql = @" SELECT * FROM Account where AccountID = '" + accountName + @"'";
string update = "UPDATE Account SET Cash = ?, PaidInCapital = ?, TotalRetainedEarnings = ?, StockholdersEquity = ?, " +
"CommonStock = ?, PreferredStock = ?, TreasuryStock = ?, CashDividends = ?, StockDividends = ?, " +
"TotalNumberPreferred = ?, PreferredMarketPrice = ?, PreferredPar = ?, Cumulative = ?, TotalNumberCommon = ?, " +
"CommonMarketPrice = ?, CommonPar = ?, NumberTransactTreasuryStock = ?, AvgPriceTreasury = ? WHERE AccountID = '" + accountName + "'";
try
{
OleDbDataAdapter da = new OleDbDataAdapter();
da.SelectCommand = new OleDbCommand(sql, conn);
AccountDatabaseDataSet ds = new AccountDatabaseDataSet();
da.Fill(ds, "Account");
DataTable dt = ds.Tables["Account"];
dt.Rows[0][1] = cash;
dt.Rows[0][2] = paidInCapital;
dt.Rows[0][3] = totalRetainedEarnings;
dt.Rows[0][4] = stockholdersEquity;
dt.Rows[0][5] = commonStock;
dt.Rows[0][6] = preferredStock;
dt.Rows[0][7] = treasuryStock;
dt.Rows[0][8] = cashDividends;
dt.Rows[0][9] = stockDividends;
dt.Rows[0][10] = totalNumberPreferred;
dt.Rows[0][11] = preferredMarketPrice;
dt.Rows[0][12] = preferredPar;
dt.Rows[0][13] = preferredRate;
dt.Rows[0][14] = cumulative;
dt.Rows[0][15] = totalNumberCommon;
dt.Rows[0][16] = commonMarketPrice;
dt.Rows[0][17] = commonPar;
dt.Rows[0][18] = numberTransactTreasury;
dt.Rows[0][19] = avgPriceTreasury;
OleDbCommand cmd = new OleDbCommand(update, conn);
cmd.Parameters.Add("@Cash", OleDbType.Decimal, 18, "Cash");
cmd.Parameters.Add("@PaidInCapital", OleDbType.Decimal, 18, "PaidInCapital");
cmd.Parameters.Add("@TotalRetainedEarnings", OleDbType.Decimal, 18, "TotalRetainedEarnings");
cmd.Parameters.Add("@StockholdersEquity", OleDbType.Decimal, 18, "StockholdersEquity");
cmd.Parameters.Add("@CommonStock", OleDbType.Decimal, 18, "CommonStock");
cmd.Parameters.Add("@PreferredStock", OleDbType.Decimal, 18, "PreferredStock");
cmd.Parameters.Add("@TreasuryStock", OleDbType.Decimal, 18, "TreasuryStock");
cmd.Parameters.Add("@CashDividends", OleDbType.Decimal, 18, "CashDividends");
cmd.Parameters.Add("@StockDividends", OleDbType.Decimal, 18, "StockDividends");
cmd.Parameters.Add("@TotalNumberPreferred", OleDbType.Integer, 16, "TotalNumberPreferred");
cmd.Parameters.Add("@PreferredMarketPrice", OleDbType.Decimal, 10, "PreferredMarketPrice");
cmd.Parameters.Add("@PreferredPar", OleDbType.Decimal, 10, "PreferredPar");
cmd.Parameters.Add("@PreferredRate", OleDbType.Decimal, 5, "PreferredRate");
cmd.Parameters.Add("@Cumulative", OleDbType.Boolean, 2, "Cumulative");
cmd.Parameters.Add("@TotalNumberCommon", OleDbType.Integer, 16, "TotalNumberCommon");
cmd.Parameters.Add("@CommonMarketPrice", OleDbType.Decimal, 10, "CommonMarketPrice");
cmd.Parameters.Add("@CommonPar", OleDbType.Decimal, 10, "CommonPar");
cmd.Parameters.Add("@NumberTransactTreasuryStock", OleDbType.Integer, 16, "NumberTransactTreasuryStock");
cmd.Parameters.Add("@AvgPriceTreasury", OleDbType.Decimal, 10, "AvgPriceTreasury");
da.UpdateCommand = cmd;
da.Update(ds, "Account");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ex.StackTrace, "Exception Details");
}
finally
{
conn.Close();
}
}
为什么人们给OLEDB参数起名字?当CommandType设置为Text时,OLE DB.NET提供程序不支持将参数传递给SQL语句或OleDbCommand调用的存储过程的命名参数。在这种情况下,必须使用问号(?)占位符。但不管文档如何操作,
UPDATE Account SET Cash='@Cash'
是错误的:您不需要在参数占位符周围放置'
。@ta.speot.很显然可能,我只是去掉了“”,就像您在第二条评论中所说的那样,在更新中添加了一个where子句,我就可以让它工作了。虽然它非常详细,但我相信它应该正常工作。OLE DB.NET Framework数据提供程序使用带问号(?)的位置参数,而不是命名参数。但你还是说出了你的名字。因此,考虑使用< <代码> >语句He..t.Seopt.使用块来添加,但是我们可以在声明时命名参数。Damith好的,所以我做了更改,现在我的代码看起来是这样的:使用(OleDbConnection conn=new OleDbConnection(ConnString)){try{conn.Open();使用(var cmd=conn.CreateCommand()){cmd.CommandText=“UPDATE Account SET Cash=?,PaidInCapital=?,其中AccountID=?”;cmd.Parameters.Add(@Cash),OleDbType.Decimal).Value=cash;cmd.Parameters.Add(“@PaidInCapital”,OleDbType.Decimal)。Value=PaidInCapital;cmd.Parameters.Add(“@AccountId”,OleDbType.VarChar)。Value=accountName;cmd.ExecuteNonQuery();}
但它仍然不会更新数据库中的任何内容任何异常?您在解决方案中放置access文件的位置?@Damith None,access文件与我的源代码位于同一文件夹中。我知道我可以访问数据库,因为我从一开始就填充了一个列表。是的,它说明如下:条件表达式中的数据类型不匹配。at System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpda tedEventArgs RowUpdateEvent、BatchCommandInfo[]batchCommands、Inter32 commandCount)等。
public void UpdateValues(string accountName)
{
OleDbConnection conn = new OleDbConnection(ConnString);
string sql = @" SELECT * FROM Account where AccountID = '" + accountName + @"'";
string update = "UPDATE Account SET Cash = ?, PaidInCapital = ?, TotalRetainedEarnings = ?, StockholdersEquity = ?, " +
"CommonStock = ?, PreferredStock = ?, TreasuryStock = ?, CashDividends = ?, StockDividends = ?, " +
"TotalNumberPreferred = ?, PreferredMarketPrice = ?, PreferredPar = ?, Cumulative = ?, TotalNumberCommon = ?, " +
"CommonMarketPrice = ?, CommonPar = ?, NumberTransactTreasuryStock = ?, AvgPriceTreasury = ? WHERE AccountID = '" + accountName + "'";
try
{
OleDbDataAdapter da = new OleDbDataAdapter();
da.SelectCommand = new OleDbCommand(sql, conn);
AccountDatabaseDataSet ds = new AccountDatabaseDataSet();
da.Fill(ds, "Account");
DataTable dt = ds.Tables["Account"];
dt.Rows[0][1] = cash;
dt.Rows[0][2] = paidInCapital;
dt.Rows[0][3] = totalRetainedEarnings;
dt.Rows[0][4] = stockholdersEquity;
dt.Rows[0][5] = commonStock;
dt.Rows[0][6] = preferredStock;
dt.Rows[0][7] = treasuryStock;
dt.Rows[0][8] = cashDividends;
dt.Rows[0][9] = stockDividends;
dt.Rows[0][10] = totalNumberPreferred;
dt.Rows[0][11] = preferredMarketPrice;
dt.Rows[0][12] = preferredPar;
dt.Rows[0][13] = preferredRate;
dt.Rows[0][14] = cumulative;
dt.Rows[0][15] = totalNumberCommon;
dt.Rows[0][16] = commonMarketPrice;
dt.Rows[0][17] = commonPar;
dt.Rows[0][18] = numberTransactTreasury;
dt.Rows[0][19] = avgPriceTreasury;
OleDbCommand cmd = new OleDbCommand(update, conn);
cmd.Parameters.Add("@Cash", OleDbType.Decimal, 18, "Cash");
cmd.Parameters.Add("@PaidInCapital", OleDbType.Decimal, 18, "PaidInCapital");
cmd.Parameters.Add("@TotalRetainedEarnings", OleDbType.Decimal, 18, "TotalRetainedEarnings");
cmd.Parameters.Add("@StockholdersEquity", OleDbType.Decimal, 18, "StockholdersEquity");
cmd.Parameters.Add("@CommonStock", OleDbType.Decimal, 18, "CommonStock");
cmd.Parameters.Add("@PreferredStock", OleDbType.Decimal, 18, "PreferredStock");
cmd.Parameters.Add("@TreasuryStock", OleDbType.Decimal, 18, "TreasuryStock");
cmd.Parameters.Add("@CashDividends", OleDbType.Decimal, 18, "CashDividends");
cmd.Parameters.Add("@StockDividends", OleDbType.Decimal, 18, "StockDividends");
cmd.Parameters.Add("@TotalNumberPreferred", OleDbType.Integer, 16, "TotalNumberPreferred");
cmd.Parameters.Add("@PreferredMarketPrice", OleDbType.Decimal, 10, "PreferredMarketPrice");
cmd.Parameters.Add("@PreferredPar", OleDbType.Decimal, 10, "PreferredPar");
cmd.Parameters.Add("@PreferredRate", OleDbType.Decimal, 5, "PreferredRate");
cmd.Parameters.Add("@Cumulative", OleDbType.Boolean, 2, "Cumulative");
cmd.Parameters.Add("@TotalNumberCommon", OleDbType.Integer, 16, "TotalNumberCommon");
cmd.Parameters.Add("@CommonMarketPrice", OleDbType.Decimal, 10, "CommonMarketPrice");
cmd.Parameters.Add("@CommonPar", OleDbType.Decimal, 10, "CommonPar");
cmd.Parameters.Add("@NumberTransactTreasuryStock", OleDbType.Integer, 16, "NumberTransactTreasuryStock");
cmd.Parameters.Add("@AvgPriceTreasury", OleDbType.Decimal, 10, "AvgPriceTreasury");
da.UpdateCommand = cmd;
da.Update(ds, "Account");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ex.StackTrace, "Exception Details");
}
finally
{
conn.Close();
}
}