2012-03-19 92 views
2
try 
{ 
    sqlCommandWithdraw.Connection.Open(); 
    sqlCommandWithdraw.Parameters["@cardNumber"].Value = Class1.cardNumber; 
    readdata = sqlCommandWithdraw.ExecuteReader(); 

    while (readdata.Read()) 
    { 
     balanceDB = decimal.Parse(readdata["balance"].ToString()); 
    } 

    decimal withdrawAmm = Convert.ToDecimal(textWithdraw.Text); 
    balanceDB = balanceDB - withdrawAmm; 
    sqlCommandWithdraw.Connection.Close(); 

    sqlCommandUpdate.Connection.Open(); 
    sqlCommandUpdate.Parameters["@cardNumber"].Value = Class1.cardNumber; 
    sqlCommandUpdate.Parameters["@balanceDB"].Value = Class1.cardNumber; 
    readdata = sqlCommandUpdate.ExecuteReader(); 
    MessageBox.Show(balanceDB +" Successfully Withdrawn"); 
} 

我工作的代码自动取款机我有点东西在收回它看起来不错,但似乎并没有改变平衡,以反映在数据库中的取款C#更新数据库错误

我的命令是这样的(更新)

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) 

,这是我的命令来选择数据

select dbo.Accounts.balance 
from dbo.ATMCards 
INNER JOIN dbo.Accounts ON dbo.ATMCards.accountID = dbo.Accounts.accountID 
where (dbo.ATMCards.cardNumber = @cardNumber) 

似乎ŧ o运行得很好添加消息框检查它感谢任何帮助感谢它!

+0

而你的问题是什么?除非我错过它... – 2012-03-19 15:11:08

+3

这看起来对我来说很可疑:sqlCommandUpdate.Parameters [“@ balanceDB”]。Value = Class1.cardNumber; – Liath 2012-03-19 15:12:31

+0

该查询是否可更新?为什么你说没有工作(在数据库中没有看到它明显的旁边..) – gbianchi 2012-03-19 15:13:50

回答

5

您正在将信用卡号码传递给参数@balanceDB - 这是第一个错误。其次,您不使用ExecuteReader来执行更新 - 而是使用ExecuteNonQuery

编辑
我会为你做一些清理工作:

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(); 
    } 

}

+0

对此稍有不满(虽然upvote是因为我错过了这个),但我相信你可以使用ExecuteReader进行更新,但不同的是它也会读取选定的行。在这种情况下,你是正确的ExecuteNonQuery是正确的选择,因为没有结果返回。 – Liath 2012-03-19 15:17:49

+1

出于兴趣为什么尝试/最后而不是使用如果你没有捕捉到任何异常? – Liath 2012-03-19 15:22:59

+1

因为OP显然已经有了已经分配给连接的SQL命令的实例。如果在他的代码中,连接和命令实例也被声明了,那么我会像使用临时阅读器一样使用''使用'。然而,OP会打开连接,关闭它,然后关闭,但是他的代码不会在异常时执行,所以我添加了try/finally,以便它更清晰。 – 2012-03-19 15:26:44

1

您为@balanceDB参数传递了错误的值。它应该是平衡量。但是你传递的是卡号。

sqlCommandUpdate.Parameters["@balanceDB"].Value = Class1.cardNumber; 

应改为

sqlCommandUpdate.Parameters["@balanceDB"].Value = balanceDB ; 
1

这行看起来可疑对我说:

sqlCommandUpdate.Parameters["@balanceDB"].Value = Class1.cardNumber; 

如果是这样Class1.balance