c# - MySql 存储过程不工作

标签 c# mysql sql stored-procedures

我创建了一个 mysql 过程,但在正确执行 sql 查询的情况下,它没有设置值paid=1:

PROCEDURE `PaidUser`(in IpId varchar(45),in UId int(20))
BEGIN

if(select count(*) as count from  users u inner join subscription s on u.ID=s.usersID inner join item i on i.id=s.itemID  where i.item_typeID !=6 and u.ID = UId having count >0)

then

update location_byhits set Paid=1 where  location_byhits.IpAddress =IpId;

END if;

end

最佳答案

您在存储过程的开头缺少CREATE,通过添加此内容,我能够让您的过程在 SQL Fiddle 上运行(注意第四个结果集有一行付费更新)

为了测试,我创建了以下数据:

CREATE TABLE location_byhits (Paid INT, IpAddress INT);
CREATE TABLE Users (ID INT);
CREATE TABLE Subscription(ItemID INT, UsersID INT);
CREATE TABLE Item (ID INT, Item_TypeID INT);
//
INSERT location_byhits VALUES (0, '192.168.0.0'), (0, '192.168.0.1');
INSERT Users VALUES (1), (2);
INSERT Subscription (1, 1), (2, 2);
INSERT Item (1, 1), (2, 6);

然后使用各种参数调用该过程 4 次。

CALL PaidUser ('192.168.0.2', 1);
CALL PaidUser ('192.168.0.0', 3);
CALL PaidUser ('192.168.0.1', 2);
CALL PaidUser ('192.168.0.1', 1);
  • 第一个不应更新,因为没有 IP 匹配。
  • 第二个不应更新,因为没有用户匹配。
  • 第三个不应更新,因为尽管存在用户和 IP 匹配,但用户 2 没有 Item_TypeID 不为 6 的关联项目。
  • 第四个应该更新,因为同时存在用户匹配和 IP 匹配,并且用户具有项目类型 ID 不是 6 的关联项目。

我倾向于按如下方式重写您的存储过程:

CREATE PROCEDURE `PaidUser`(in IpId VARCHAR(45),in UId INT(20))
BEGIN

    UPDATE  location_byhits 
    SET     Paid = 1 
    WHERE   location_byhits.IpAddress = IpId
    AND     EXISTS
            (   SELECT  1
                FROM    Users u 
                        INNER JOIN Subscription s 
                            ON u.ID = s.usersID 
                        INNER JOIN Item i 
                            ON i.ID = s.ItemID  
                WHERE   i.Item_TypeID != 6 
                AND     u.ID = UId 
            );
END

如果在更新之前进行检查,尽管可能性很小,但在开始检查和更新之间数据被另一个 session 更改也不是不可能的。这可能会导致意外的行为。如果您在一条语句中完成所有操作,则可以避免并发问题。

<强> Example on SQL Fiddle

关于c# - MySql 存储过程不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19661606/

相关文章:

c# - MVC5 自定义绑定(bind) : List of Strings to List of Complex Type

mysql - 用于索引表的 OR 和 IN 运算符的替代方案

c# - 我们有一个图形设计师,现在他们想要一个基于文本的设计师。建议?

c# - 在 Java 中读取 C# 字节数组

c# - 类型在 Visual Studio 中未突出显示其通常的绿色

php - 从数据库中的交集行和列中选择一个价格

mysql - 数据库 : User Profiles

sql - 如何将字符串中的值分离到postgresql中的列中?

c# - Entity Framework 6.1 Code First Cascading Delete with TPH 用于派生类型上的一对一关系

sql - postgres查找同一列数字之间的差异