本人使用的是.netframework4.5 WPF 框架开发的上位机软件,在程序开发中使用ORM和FreeSql作为数据库开发工具,最近在使用FreeSql的时候遇到一些问题,解决后记录下来。
如何在C#中使用FreeSql进行存储过程的执行,以下代码示例:
var dt = ORM.FreeSqlOperater.pboxSql.Ado.CommandFluent("CALL get_product_status(@a1,@a2,@a3,@a4,@a5,@'a6',@'a7')")
.WithParameter("a1", p_Index)
.WithParameter("a2", p_Dispatch_No)
.WithParameter("a3", p_Part_No)
.WithParameter("a4", p_Product_No)
.WithParameter("a5", p_Operation_No)
.WithParameter("a6", null, v => v.Direction = ParameterDirection.Output)
.WithParameter("a7", null, v => v.Direction = ParameterDirection.Output)
.ExecuteDataTable();
我的存储过程是这样的:
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_product_status`(
IN `p_Index` INT,
IN `p_Dispatch_No` VARCHAR(50),
IN `p_Part_No` VARCHAR(50),
IN `p_Product_No` VARCHAR(50),
IN `p_Operation_No` INT,
OUT `o_Result` INT,
OUT `o_Seq_No` VARCHAR(50)
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT '获取产品在当前工单下所有测试项状态结果'
BEGIN
-----省略内容--------------
最后一步
select o_Result,o_Seq_No;输出两个参数
END
可以看到我有两个输出参数,其实FreeSql里面的CommandFluent这个方法,实际上和我们使用sql语句是一样的,因为我有两个输出参数,其中一个输出参数是字符,字符在sql里面需要添加单引号,我尝试了很久终于知道需要在@后面加上单引号,说明这是一个字符参数。@符号表示这是一个参数,请注意直接写sql语句和FreeSql里面执行存储过程的区别就在于,参数需要添加@符号。
因为项目需要FreeSql我是做了一个公共类,方便使用和记录日志。部分代码如下:
namespace ORM
{
public class FreeSqlOperater
{
/// <summary>
/// 生产数据库操作对象
/// </summary>
public static IFreeSql pboxSql = null;
static FreeSqlOperater()
{
pboxSql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.MySql, pboxConnstr)
.UseAutoSyncStructure(false) //不自动同步实体结构到数据库
.Build(); //请务必定义成 Singleton 单例模式
//省略记录日志,可自由发挥
}
}
}