#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
inusing
.
Ответ №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:
- Когда вы выполняете select * из продуктов, возвращает ли запрос какой-либо результат?
Вам также нужно начинать с 0, поэтому попробуйте поставить reader.getString(0)
Комментарии:
1. Да, когда я выполняю запрос с помощью SELECT * ИЗ продуктов в БД, он возвращает все мои продукты 🙂 спасибо, я изменил его, чтобы начать с 0