Получение имен поставщиков в комбинированном списке с помощью Dapper - PullRequest
0 голосов
/ 07 февраля 2020

Я относительно новичок в Dapper, а также C#. Я пытаюсь получить имена поставщиков из базы данных SQL в поле со списком при открытии формы.
Вот код: Таблицы базы данных выглядят так:

CREATE table [dbo].[PURCH_VENDOR]   
([VENDOR_ID] varchar(20),  
      ,[VEND_NAME] varchar(20),  
      ,[VEND_ADDRESS] varchar(20),  
      ,[VEND_PHONE] varchar(20),   
      ,[VEND_WEBSITE] varchar(20),  
      ,[NOTES] varchar(20))    

Класс поставщика:

public class Vendor:IVendor
    {
        //properties
        public int ID;
        public string Name { get; set; }
        public string Address { get; set; }
        public string Phone { get; set; }
        public string Website { get; set; }
        public string Notes { get; set; }

        public static string ErrorMessage { get; set; }
        //Constructors
        public Vendor(string name,string address,string phone,string website,string notes)
        {
            Name = name;
            Address = address;
            Phone = phone;
            Website = website;
            Notes = notes;
        }
        public Vendor(string name)
        {
            Name = name;
        }
        public Vendor() { }
        public List<Vendor> GetVendors()
        {
            using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(Helper.CnnVal("SAMPLEDB")))
            {
                var output = connection.Query<Vendor>("select vend_name from dbo.purch_vendor").ToList();
                return output;
            }
        }  

Код в форме выглядит следующим образом:

public partial class AddVendor : Form
    {
        //List<Vendor> vendor = new List<Vendor>();
        public AddVendor()
        {
            InitializeComponent();
            Vendor db = new Vendor();
            var outp = db.GetVendors();
            foreach (Vendor vd in outp)
            {
                cb_vendorName.Items.Add(vd.Name);//This is where the error kicks in
            }
            //IVendor vendorRep = new Vendor();
            //List<Vendor> vendor = vendorRep.GetAll();
            //foreach(var vend in vendor)
            //{
            //    //Console.WriteLine(vend.Name);
            //    cb_vendorName.Items.Add(vend.Name);
            //}
        } 
    } 

Я получаю следующую ошибку:

Необработанное исключение типа 'System. ArgumentNullException 'произошло в System. Windows .Forms.dll

, но у меня нет значений NULL в базе данных для имен поставщиков.
Когда я отлаживал, казалось, что он распознает, что есть две записи в базе данных, но не заполняет ни одно из свойств членов. Любая помощь будет оценена. Спасибо!

1 Ответ

1 голос
/ 08 февраля 2020

Кажется, у вас есть две проблемы. Во-первых, есть проблема дизайна, которая не вызывает исключений, которые вы испытываете, но это то, что вы должны исправить в любом случае. Vendor является классом модели и должен содержать только перечисленные вами свойства (плюс конструкторы). Получение списка Vendor объектов внутри самого класса Vendor не является хорошим дизайном. Вы должны сделать это в другом классе или даже в основном классе, где вы заполняете ComboBox.

Теперь, к ошибке, с которой вы столкнулись. Используя SQL запрос select vend_name from dbo.purch_vendor, вы получаете только одно поле, которое не может быть сопоставлено ни с одним из свойств вашего Vendor класса.

, поскольку VEND_NAME - это имя целевого столбца в вашей таблице БД purch_vendor, вы должны иметь это также в качестве имени свойства в вашей модели:

public string VEND_NAME { get; set; } // instead of Name

В противном случае механизм отображения не будет знать, какое поле заполнить.

Если вы посмотрите на этот простой пример , вы увидите, что имена столбцов 1: 1 по отношению к именам свойств в классе модели. Таким образом, свойства будут заполнены очень хорошо, когда вы сделаете запрос.

...