Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MS SQL Server-检查您是否有更多的钱,然后您应该支付_C#_Sql Server - Fatal编程技术网

C# MS SQL Server-检查您是否有更多的钱,然后您应该支付

C# MS SQL Server-检查您是否有更多的钱,然后您应该支付,c#,sql-server,C#,Sql Server,嘿,我想检查我是否有足够的钱购买,我如何在c和MS SQL Server中检查 我试过了 " SELECT Money FROM [User] WHERE Isactive ='1' IF (SELECT Money FROM [User] >= '"+ customPayTextBox.Text+"') UPDATE [User] SET Money WHERE Isactive ='1' = Money - 100" 我也尝试过不使用if语句下的SELECT Money FROM[U

嘿,我想检查我是否有足够的钱购买,我如何在c和MS SQL Server中检查

我试过了

" SELECT Money FROM [User] WHERE Isactive ='1' IF (SELECT Money FROM [User] >= '"+ customPayTextBox.Text+"') UPDATE [User] SET Money WHERE Isactive ='1' = Money - 100"
我也尝试过不使用if语句下的SELECT Money FROM[User]

我做错了吗


它是如何在c中实现的?当我单击按钮运行此命令时,是否可以得到true或false作为返回?或者,如果我没有足够的钱购买,该命令不会运行吗?

这里有一些问题。首先,

SELECT Money FROM [User] >= '"+ customPayTextBox.Text+"'
从[用户]选择货币可能返回多行

第二,

'"+ customPayTextBox.Text+"'
您不应该用未经验证的用户输入构建这样的查询;首先,您不知道customPayTextBox.Text中是否有一个有效的整数。另一方面,这是一个风险的一个

第三,

UPDATE [User]
SET Money = Money - 100
将从数据库中的每一行中减去100,至少在SQL Server中是这样,我还没有在MySQL上测试过。我不确定你是不是想这么做

最后,第一个查询:

SELECT Money
FROM [User]
WHERE Isactive ='1'
在这里实际上不会做任何有用的事情-您既不存储也不使用结果

另外,我强烈建议您将代码格式化好;它使阅读和理解变得更加容易,因此,调试、维护和校对潜在问题变得更加容易

编辑:下面是以下表格结构的查询示例:

--------------------
| UserID | [Money] |
--------------------
| 1      | 0       |
| 2      | 100     |
| 3      | 200     |
--------------------
以下代码使用SQL Server语法:

IF ((select [Money] FROM MyTestTable WHERE ID = 1) >= 100)
    PRINT 'Yes' -- Substitute whatever action you want here
ELSE -- Include this if you want to take some action if they don't have enough money
    PRINT 'No' -- Again, substitute whatever action you want here
如果用户1至少有100美元,将打印“是”,如果用户1少于100美元,将打印“否”

您也可以这样做:

SELECT CASE WHEN ((select top 1 [Money] FROM MyTestTable WHERE ID = 1) >= 100) then 1 else 0 END
如果只返回true/false,我想在MySQL中应该是true/false。

您的SELECT语句既不需要也不存储。 这一切都可以通过在UPDATE语句中使用WHERE子句来完成

我基于SQL Server语法编写了这篇文章,并对查询进行了参数化,以避免SQL注入。既不使用C代码也不使用db模式,我使用的是通用Sql连接&命令类型;因此,您很可能需要根据自己的情况进行调整

您将需要的另一件事是识别要更新的行,我已经用UserID参数对其进行了泛型

int rowsAffected;
string connString = "";
int Money = (int)customPayTextBox.Text;

using (SqlConnection conn = new SqlConnection(connString)) {
    conn.Open();
    using (SqlCommand cmd = new SqlCommand()) {
        cmd.Connection = conn;
        cmd.CommandText = "UPDATE [User] SET Money = Money - 100 WHERE (IsActive = '1') AND (UserID = @UserID) AND (Money >= @Money);";
        cmd.CommandType = CommandType.Text;
        cmd.Parameters.AddWithValue("@Money", Money);
        cmd.Parameters.AddWithValue("@UserID", UserID);

        rowsAffected = cmd.ExecuteNonQuery();
    }
    conn.Close();
}

if (rowsAffected == 0) { /* user not found OR not enough funds */ }
else { /* at least 1 row was updated */ }

你确定你使用MySQL吗?语法建议使用ms sql server。此外,请同时包含c代码。您是否可以提供有关问题背景的更多信息?不需要选择,您可以在一次更新中完成此操作请注意,您的更新查询`update[User]SET Money=Money-100`更新用户表中的所有行,因为没有过滤的位置如果从[user]>='+customPayTextBox.Text+'中选择Money,你听说过注入SQL吗?好吧,这是我的错,我在代码中添加了Isactive='1'。但我这里的问题是检查我在那个活动帐户上是否有足够的钱,它如何检查。@MortenSyhlerJensen这只是问题的部分解决办法,因为查询至少在逻辑上仍然可以返回多行。这是正确的,但在我的应用程序中,现在一次只有一行在线,所以对于这一点,它不会是一个problem@MortenSyhlerJensen关键的短语是现在一次只有一个在线。当你开始同时有几个用户在线时会发生什么?对不起,我无法让它工作,我仍然无法控制它,我使用了Mad Myche方法。