C#更新数据库错误
我正在为一台自动取款机编写代码我在取款机上有点忙它看起来不错,但似乎没有改变余额来反映数据库中的取款情况 我的命令如下(更新) 这是我选择数据的命令C#更新数据库错误,c#,visual-studio-2010,C#,Visual Studio 2010,我正在为一台自动取款机编写代码我在取款机上有点忙它看起来不错,但似乎没有改变余额来反映数据库中的取款情况 我的命令如下(更新) 这是我选择数据的命令 update dbo.Accounts set balance = @balanceDB from dbo.ATMCards INNER JOIN dbo.Accounts ON dbo.ATMCards.accountID = dbo.Accounts.accountID where (dbo.ATMCards.cardNumber = @ca
update dbo.Accounts
set balance = @balanceDB
from dbo.ATMCards
INNER JOIN dbo.Accounts ON dbo.ATMCards.accountID = dbo.Accounts.accountID
where (dbo.ATMCards.cardNumber = @cardNumber)
似乎运行刚刚好添加了消息框检查它感谢任何帮助感谢它 您为
@balanceDB
参数传递了错误的值。它应该是余额。但是你正在传递卡号
select dbo.Accounts.balance
from dbo.ATMCards
INNER JOIN dbo.Accounts ON dbo.ATMCards.accountID = dbo.Accounts.accountID
where (dbo.ATMCards.cardNumber = @cardNumber)
应改为
sqlCommandUpdate.Parameters["@balanceDB"].Value = Class1.cardNumber;
我觉得这句话很可疑:
sqlCommandUpdate.Parameters["@balanceDB"].Value = balanceDB ;
是否应该是
Class1.balance
?您正在将信用卡号传递给参数@balanceDB
-这是第一个错误。其次,不使用ExecuteReader
执行更新-而是使用ExecuteNonQuery
编辑我将为您做一些清理:
sqlCommandUpdate.Parameters["@balanceDB"].Value = Class1.cardNumber;
}您的问题是什么?除非我找不到它……我觉得这很可疑:sqlCommandUpdate.Parameters[“@balanceDB”].Value=Class1.cardname;这个查询是可更新的吗?为什么你说它不起作用(除了数据库中明显的at-not-seen之外…@Rhys-Brace:+1用于使用参数化查询!在这一点上稍微进行了重新调整(尽管由于我错过了这一步,所以进行了升级投票),我相信您可以使用ExecuteReader进行更新,但不同的是,它还将读取选定的行。在这种情况下,您是正确的ExecuteOnQuery是正确的选择,因为没有返回任何结果。出于兴趣,如果您没有捕获任何异常,为什么要尝试/Finally而不是使用?因为OP显然已经有已分配给连接的SQL命令实例。如果在他的代码中,连接和命令实例也被声明了,我会像在临时读取器中一样使用
using
。然而,OP打开连接,做他的事情,然后关闭is,但是他的代码不会在异常情况下执行,所以我添加了try/finally,这样它会更干净一些。@Liath:实际上,我从未尝试使用ExecuteReader
进行更新。想想看,我看不出它为什么不能工作的原因——但我认为,如果事先知道没有结果集,就不可能产生创建潜在的空结果集和读取器(必须关闭)的开销……我完全同意,ExtruuteNoQuess是在这种情况下使用的正确方法。我试图澄清,在同一查询中执行更新和选择的情况下,可以使用ExecuteReader执行更新。
sqlCommandUpdate.Parameters["@balanceDB"].Value = Class1.cardNumber;
try
{
try
{
sqlCommandWithdraw.Connection.Open();
sqlCommandWithdraw.Parameters["@cardNumber"].Value = Class1.cardNumber;
// Make sure to dispose of the reader, which also closes the reader, which
// is important, because you can't perform any other selects on a connection
// with an open reader!
using (SqlDataReader reader = sqlCommandWithdraw.ExecuteReader())
{
// You will only get one line - also, your code also only evaluates
// one result, so we can do the following:
if (reader.Read())
{
balanceDB = decimal.Parse(readdata["balance"].ToString());
}
}
}
finally
{
sqlCommandWithdraw.Connection.Close();
}
decimal withdrawAmm = Convert.ToDecimal(textWithdraw.Text);
balanceDB = balanceDB - withdrawAmm;
try
{
sqlCommandUpdate.Connection.Open();
sqlCommandUpdate.Parameters["@cardNumber"].Value = Class1.cardNumber;
sqlCommandUpdate.Parameters["@balanceDB"].Value = balanceDB;
sqlCommandUpdate.ExecuteNonQuery();
MessageBox.Show(balanceDB +" Successfully Withdrawn");
}
finally
{
sqlCommandUpdate.Connection.Close();
}