c#dapper存储过程返回null

hjqgdpho  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(350)

我试着做的每件事都不停地吐空。这是获取数据的方法

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());

它总是返回\u itm\u id=0、\u itm\u name=null、\u itm\u price=0。连接已打开,插入方法工作正常。行不是空的。我从一个运行良好的查询中复制了select硬编码语句。
这是table

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`)
)
7nbnzgx9

7nbnzgx91#

dapper中内置的Map器的默认处理要求类属性名与列名匹配或用下划线分隔。
例如,列 ItemName 将匹配属性 ItemName 或者 Item_Name 反之亦然。对于不遵循此方案的列,有更复杂的Map可用,如果您想走这条路线,请参阅前面的答案。
我举了一个简单的例子。
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; }
    }
}

输出

c9x0cxw0

c9x0cxw02#

您的数据库列名为 itm_id ,但您的c#类属性名为 _itm_id . 名称需要匹配,dapper才能从 MySqlDataReader 行到c对象。
将类更改为以下值,Map应成功:

public class Item
{ 
    public int itm_id { get; set; }
    public string itm_name { get; set; }
    public float itm_price { get; set; }
}

相关问题