C#从数据库加载对象

时间:2018-10-16 01:27:58

标签: c# dapper

我知道整个Internet上都详细讨论了这个主题,但是我只是不了解我所读/发现的任何内容。所以我要来这里。

我有一个存储过程,该存储过程带有一个初始参数,该初始参数指示需要执行哪些操作(例如,Insert,Check和Get)。我这样做只是为了将特定对象的所有功能放在一个文件中(可能不是最好的设计,但这就是我的位置)。因此,当调用此存储过程时,第一个参数是需要发生的事情-要插入数据的内容,那么“ Insert”是第一个参数。

我遇到问题的地方是尝试将数据从数据库“加载”到对象中。我有Dapper,但我只是根本不了解它的实际工作原理。

存储过程:

CREATE OR ALTER PROCEDURE sp_Customers
 @Action varchar(max)
 @customername = varchar(max)
AS
BEGIN
SET NOCOUNT ON;

IF @Action = 'Retrieve'
 BEGIN
  SELECT customer_id, internal_id, customer_address, city, customer_state, zip, project, sponsor, customer_name
  FROM tbl_Customers
  WHERE customer_name = @customername;
  RETURN
 END

客户类别:

public class Customer{
 public int customer_id {get;}
 public int internal_id { get; set; }
 public string customer_address { get; set; }
 public string city { get; set; }
 public string customer_state { get; set; }
 public int zip { get; set; }
 public int project { get; set; }
 public int sponsor { get; set; }
 public string customer_name { get; set; }

我只希望此类中的一个函数用数据库中的信息填充自身。我有Dapper,但是这使我很困惑,我已经在互联网上阅读了各种各样的东西,并且使我的生活变得很混乱...难道真的很难装载物体吗?

2 个答案:

答案 0 :(得分:1)

类似的事情(为了可读性而分成多行,未经测试或编译)

public Customer GetCustomer(string name)
{
    using (var connection = new SqlConnection(...))
    {
         var spName = "sp_Customers";

         var parameters = new 
         { 
             Action = "Retrieve", 
             CustomerName = name
         };

         var commandType = CommandType.StoredProcedure;

         return connection.QuerySingleOrDefault<Customer>(spName, parameters, commandType: commandType); 
    }
}

答案 1 :(得分:1)

  

我的存储过程带有一个初始参数,该参数指示   需要执行什么操作(例如,插入,检查和获取)。我做   这只是为了将特定对象的所有功能放在一个文件中   (可能不是最好的设计,但这就是我的位置)。所以当这个   调用存储过程,第一个参数是需要发生什么   -要插入数据的内容,那么“ Insert”是第一个参数。

我认为这就是您所有问题的来源。除非我缺少任何内容,否则您甚至应该无法从该存储过程返回数据。因为在SQL中,存储过程当然需要定义的返回类型。这样select永远不会发送任何东西。

您应该具有包含CRUD操作的一部分的存储过程:

  • 创建应返回PrimaryKey的类型。因为您通常非常需要通过OUTPUT语法提取PrimaryKey值并将其返回给programmin
  • 更新应具有返回结果的通知类型:找不到,由于“更新比赛条件预防”而未更新,已更新
  • 当然选择还需要使东西更接近桌子