C# MySQL存储登录过程[返回表]

C# MySQL存储登录过程[返回表],c#,mysql,database,routines,C#,Mysql,Database,Routines,我正在尝试为ASP.net web应用程序创建一个简单的登录名,其中我使用MySQL作为数据库,ODBC作为连接器。现在我想通过调用MySQL例程而不是应用程序端SQL来防止SQL注入 传统上,我可以运行SQL语句并接收表结果,然后将其存储在数据类中。这样,我就可以轻松访问用户属性,如角色等,而无需再次查询数据库。 现在使用mysql过程或函数,我似乎只能返回简单的值,比如string、int或bit,而不是完整的表。 因此,当我想要拥有完整的表时,我是否必须运行2个查询?一个作为存储函数,如果

我正在尝试为ASP.net web应用程序创建一个简单的登录名,其中我使用MySQL作为数据库,ODBC作为连接器。现在我想通过调用MySQL例程而不是应用程序端SQL来防止SQL注入

传统上,我可以运行SQL语句并接收表结果,然后将其存储在数据类中。这样,我就可以轻松访问用户属性,如角色等,而无需再次查询数据库。 现在使用mysql过程或函数,我似乎只能返回简单的值,比如string、int或bit,而不是完整的表。
因此,当我想要拥有完整的表时,我是否必须运行2个查询?一个作为存储函数,如果登录成功,则返回用户id,另一个作为用户信息?或者函数能够返回完整的表吗?

在MySQL服务器中无法编写表值存储过程。MySQL存储函数只返回单个值

但是,如果情况需要函数返回一组数据,则只有两种选择:

  • 您可以在结果集中使用一些分隔符创建字符串,并将其返回给调用者
  • 另一个好的选择是使用临时表


首先,我完全同意你的新方法。将SQL代码排除在应用程序之外是一个非常好的主意


我想这取决于您的ODBC驱动程序。根据经验,我知道你可以使用。您完全可以使用它从存储过程中获取数据集。

与其他DBMS不同,MySQL函数不能返回结果集(可以像表一样使用)。但我相信(不确定!)MySQL至少支持ref游标,它也可以用于返回过程的结果。将逻辑移动到数据库不仅不会阻止SQL注入,而且还会以一种难以逆转的方式将应用程序耦合到数据库。使用已建立的(传统的)
SqlCommand
或等效命令,验证您的输入,将您的逻辑保持在C#中,使用数据访问层、存储库模式或类似方式进行版本控制和清理,与应用程序的其余部分分离。