C#SQL Server存储过程参数返回列表

时间:2018-08-02 06:02:31

标签: c# sql-server stored-procedures dapper

我正在尝试执行一个带两个参数并返回结果列表的SQL Server存储过程。该应用程序将返回结果,但是我不确定如何将值分配给模型中的列表。正在使用的ORM是Dapper。这是我的代码

string startTime = "2018-04-17 00:00:00.000";
string endTime = "2018-04-17 23:59:59.997";
string db = "database";

List<ShelfInventoryModel> output = new List<ShelfInventoryModel>();

using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(SqlConnection.CnnString(db)))
{
    DataTable dt = new DataTable();

    var p = new DynamicParameters();
    p.Add("@StartDate", startTime);
    p.Add("@EndDate", endTime);

    output = connection.Query<ShelfInventoryModel>("dbo.spGetInventory_Liquor", p, commandType: CommandType.StoredProcedure).ToList();

    Console.WriteLine(output);
    Console.ReadLine();
}

这是模型类

public class ShelfInventoryModel
{
    public decimal Quantity { get; set; }
    public string ItemName { get; set; }
}

我了解需要将结果填充到潜在的数据适配器中。但是,当我尝试将输出填充到数据适配器时,系统给我一个错误

将结果返回到控制台的目的。但是,此时控制台仅显示:

  

System.Collections.Generic.List`1 [ProcedureTest.ShelfInventoryModel]

3 个答案:

答案 0 :(得分:2)

Console.WriteLine(output);将仅在参数上显示ToString的结果,此类型将恢复为默认实现,该默认实现仅显示output对象的类型名称。您需要使用foreach遍历列表中的项目:

foreach (var item in output)
{
    Console.WriteLine(item);
}

这将导致您仅给出该对象的类型而获得一行行。因此,您可以为您的对象编写ToString的实现,也可以只显示要查看的位...

foreach (var item in output)
{
    Console.WriteLine($"{item.ItemName} {item.Quantity}");
}

答案 1 :(得分:0)

您可以使用此:

string startTime = "2018-04-17 00:00:00.000";
string endTime = "2018-04-17 23:59:59.997";
string db = "database";

List<ShelfInventoryModel> output = new List<ShelfInventoryModel>();

using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(SqlConnection.CnnString(db)))
{
    DataTable dt = new DataTable();

    var p = new DynamicParameters();
    p.Add("@StartDate", startTime);
    p.Add("@EndDate", endTime);

    output = connection.Query<ShelfInventoryModel>("dbo.spGetInventory_Liquor", p, commandType: CommandType.StoredProcedure).ToList();

    foreach (ShelfInventoryModel item in output)
    {
        Console.WriteLine(item.Quantity.ToString());
        Console.WriteLine(item.ItemName);
    }       
}

答案 2 :(得分:0)

以下是工作代码,以便应用程序将结果列表返回到控制台

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{

    if ([annotation isKindOfClass:[MKPointAnnotation class]]){

        MKAnnotationView *pinView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"];

        if(!pinView){

            pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CustomPinAnnotationView"];

            pinView.canShowCallout = YES;
            pinView.image = [UIImage imageNamed:@"Annotation"];
            pinView.calloutOffset = CGPointMake(0, 0);

        }
        else{

            pinView.annotation = annotation;
        }

        return pinView;
    } else if ([annotation isKindOfClass:[SecondAnnotation class]]){

        MKAnnotationView *pinView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"];

        if(!pinView){

            pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CustomPinAnnotationView"];

            pinView.canShowCallout = YES;
            pinView.image = [UIImage imageNamed:@"Second"];
            pinView.calloutOffset = CGPointMake(0, 0);

        }
        else{

            pinView.annotation = annotation;
        }

        return pinView;
    }
    return nil;

}