C # dapper хранимая процедура, возвращающая ноль - PullRequest
0 голосов
/ 06 октября 2018

Все, что я пытаюсь сделать, просто продолжает выплевывать ноль.Это метод, который получает данные

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

ПРИМЕЧАНИЕ: Запрос жестко запрограммирован для целей тестирования, обычно заменяется хранимой процедурой Даже если в жестком коде он по-прежнему возвращает ноль.

Класс предметов

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. Соединение открыто, метод вставки работает нормально.Строка не пустая.Я скопировал жестко закодированный оператор из запроса, который работал отлично.

Это таблица

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 голосов
/ 06 октября 2018

Ваш столбец базы данных называется 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; }
}
0 голосов
/ 06 октября 2018

Обработка по умолчанию для преобразователя, встроенного в Dapper, требует, чтобы имена свойств класса совпадали с именами столбцов или были разделены подчеркиванием.

Например, столбец ItemName будет соответствовать свойству ItemName илиItem_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; }
    }
}

Выход

enter image description here

...