首页 > 解决方案 > c# dapper存储过程返回null

问题描述

我尝试做的所有事情都只是不断吐出空值。这是获取数据的方法

public List<Item> getItems(string item_name)
{
    using (IDbConnection connection = new MySqlConnection(Helper.CnnVal("dbConn")))
    {
        connection.Open();

        return connection.Query<Item>($"SELECT * FROM ITEMS WHERE itm_name = 'Jaje'").ToList();
    }
}

注意:为了测试目的,查询是硬编码的,通常由存储过程替换, 即使硬编码它仍然返回 null。

项目类

public class Item
{ 
    public int _itm_id { get; set; }
    public string _itm_name { get; set; }
    public float _itm_price { get; set; }

}

我在按下按钮时运行的 .xaml.cs 文件中也有以下代码

List<Item> items = new List<Item>();
items = da.getItems(txtboxItemNameSearch.Text.Trim());

它总是返回 _itm_id = 0,_itm_name = null,_itm_price = 0。连接打开,插入方法工作正常。该行不为空。我从完美运行的查询中复制了 select 硬编码语句。

这是桌子

CREATE TABLE `items` (
`itm_id` INT(255) NOT NULL AUTO_INCREMENT,
`itm_name` VARCHAR(255) NOT NULL,
`itm_price` FLOAT(8,2) NOT NULL,
PRIMARY KEY (`itm_id`),
UNIQUE INDEX `itm_name` (`itm_name`)
)

标签: c#mysqlstored-proceduresdapper

解决方案


Dapper 中内置的映射器的默认处理要求类属性名称与列名称匹配或用下划线分隔。

例如,列ItemName将匹配属性ItemNameItem_Name反之亦然。对于不遵循此方案的列,有更复杂的映射可用,如果您想走这条路线,请参阅此先前的答案

我创建了一个快速示例。

SQL

CREATE DATABASE TEST;
GO

USE TEST;
GO

CREATE TABLE ITEM (
    [Id] INT IDENTITY(1, 1)
    ,[Name] VARCHAR(255)
    ,[Price] MONEY
    );
GO

INSERT INTO ITEM ([Name], [Price]) 
SELECT 'item 1', 10
UNION SELECT 'item 2', 20
UNION SELECT 'item 3', 30
UNION SELECT 'item 4', 40
UNION SELECT 'item 5', 50
UNION SELECT 'item 6', 60
UNION SELECT 'item 7', 70
UNION SELECT 'item 8', 80
UNION SELECT 'item 9', 90
UNION SELECT 'item 10', 100;
GO

C#

using Dapper;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var items = getItems("Item 1");

            foreach (var item in items)
            {
                Console.WriteLine("Id: {0}", item.id);
                Console.WriteLine("Name: {0}", item.name);
                Console.WriteLine("Price: {0}", item.price);
                Console.ReadLine();
            }
        }

        public static IList<Item> getItems(string name)
        {
            using (var connection = new SqlConnection("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=test;Integrated Security=True"))
            {    
                return connection.Query<Item>($"SELECT * FROM ITEM WHERE name = @name",
                    new { name }).ToList();
            }
        }
    }

    public class Item
    {
        public int id { get; set; }
        public string name { get; set; }
        public decimal price { get; set; }
    }
}

输出

在此处输入图像描述


推荐阅读