Показывать содержимое таблицы SQL Server в консольном приложении C #

#c# #sql #sql-server #select

#c# #sql #sql-сервер #выберите

Вопрос:

Я пытаюсь показать некоторое содержимое из моей базы данных SQL Server в моем консольном приложении C #.

Пока у меня есть этот класс :

 public SqlConnection connection()
{
    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
    builder.DataSource = "DESKTOP-UPVVOJP";
    builder.InitialCatalog = "Lagersystem";
    builder.IntegratedSecurity = true;

    return new SqlConnection(builder.ToString());
}
  

Класс модели продукта :

 public class Product
{
    public int ProductID { get; set; }
    public string ProductName { get; set; }
    public int ProductStock { get; set; }
    public int ProductCategoryID { get; set; }
    public int ProductEmployeeID { get; set; }
    public DateTime ProductCreatedDate { get; set; }

    // Constructor
    public Product(string productname, int productstock, int productcategoryid, int productemployeeid)
    {
        ProductName = productname;
        ProductStock = productstock;
        ProductCategoryID = productcategoryid;
        ProductEmployeeID = productemployeeid;
        ProductCreatedDate = DateTime.Now;
    }
}
  

Отобразить метод products в программе :

 static void DisplayProducts()
{
    List<Product> products = new List<Product>();
    Database db = new Database();
    SqlConnection conn = db.connection();
    conn.Open();

    using SqlCommand command = new SqlCommand(@"SELECT * FROM Products", conn);
    {
        SqlDataReader reader = command.ExecuteReader();

        while (reader.Read())
        {
            string productname = reader.GetString(1);
            int productstock = reader.GetInt32(2);
            int productcategoryid = reader.GetInt32(3);
            int productemployeeid = reader.GetInt32(4);

            products.Add(new Product() { ProductName = productname, ProductStock = productstock, 
                ProductCategoryID = productcategoryid, ProductEmployeeID = productemployeeid });
        }
    }

    foreach (Product product in products)
    {
        Console.WriteLine(product);
    }
}
  

и вызвать его из моего основного метода :

 static void Main(string[] args)
{
    DisplayProducts();
}      
  

В моем DisplayProducts методе я получаю сообщение об ошибке при выполнении этого :

 products.Add(new Product() { ProductName = productname, ProductStock = productstock, 
                        ProductCategoryID = productcategoryid, ProductEmployeeID = productemployeeid });
  

Ошибка:

Не указан аргумент, соответствующий требуемому формальному параметру ‘productname’ из ‘Product.product(string, int, int, int)’

Я действительно не знаю, что это значит, искал и искал, но пока ничего не нашел.

Комментарии:

1. Операторы Wrap SqlConnection и SqlDataReader in using .

Ответ №1:

Это означает, что конструктору Product требуется четыре аргумента, а вы не предоставляете ни одного.

Вот подпись вашего конструктора :

  // Constructor
    public Product(string productname, int productstock, int productcategoryid, int productemployeeid)
  

Измените строку

 products.Add(new Product() { ProductName = productname, ProductStock = productstock, 
                ProductCategoryID = productcategoryid, ProductEmployeeID = productemployeeid });
  

этим и все будет в порядке

 products.Add(new Product( productname, productstock, productcategoryid, productemployeeid));
  

Комментарии:

1. Я получаю сообщение об ошибке от «String productname = reader. getString(0); Это говорит: System. InvalidCastException: ‘Невозможно преобразовать объект типа ‘System.Int32’ в тип ‘System. Строка’.’ Но я этого не понимаю? это не Int .. и, насколько я вижу, я вызываю его как строку, а не как int?

2. использование select * — плохая практика, вы всегда должны указывать имя столбца в своем запросе. В вашем случае мы не знаем, какое поле является первым. Пожалуйста, измените свой запрос на «выберите productname, productstock, productcategoryid, productemployeeid из таблицы …»

3. Спасибо, я этого не знал. но я вижу, это потому, что, если вы внесете изменения в БД позже, метод может завершиться неудачей, потому что я беру *. Это работает, я получаю выходные данные.. хотя я получаю вывод: «Lagersystem.DB.Product Lagersystem.DB.Product Lagersystem.DB.Product Lagersystem.DB.Product Lagersystem.DB.Product» вместо фактического содержимого в БД.

4. если вы считаете, что я ответил на первоначальный вопрос, пожалуйста, отметьте его как ответ. Для последнего вопроса это «Консоль. WriteLine(product);» вам нужно изменить, чтобы напечатать правильное значение. (т.е. консоль. напишите (product.productname » » product. …. );

Ответ №2:

  1. Когда вы выполняете select * из продуктов, возвращает ли запрос какой-либо результат?

Вам также нужно начинать с 0, поэтому попробуйте поставить reader.getString(0)

Комментарии:

1. Да, когда я выполняю запрос с помощью SELECT * ИЗ продуктов в БД, он возвращает все мои продукты 🙂 спасибо, я изменил его, чтобы начать с 0