c#dapper存储过程返回null

时间:2018-10-06 00:41:00

标签: c# mysql stored-procedures 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。 连接已打开,insert方法工作正常。该行不为空。我从查询中复制了选择的硬编码语句,效果很好。

这是桌子

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

2 个答案:

答案 0 :(得分:0)

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

例如,列ItemName将与属性ItemNameItem_Name相匹配,反之亦然。对于不遵循此方案的列,还有更复杂的映射可用,如果您要采用该路线,请参见此previous answer

我创建了一个简单的示例。

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; }
    }
}

输出

enter image description here

答案 1 :(得分:0)

您的数据库列名为itm_id,但您的C#类属性名称为_itm_id。名称需要匹配,Dapper才能将MySqlDataReader行中的值分配给C#对象。

将您的类更改为以下内容,映射将成功:

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