Tag: data access layer

C#:Services访问运行sql语句的dataprovider类 – 正确的方法?

这是一种常见的和/或好的方法吗? 在我的ViewModel(Wpf)或Presenter(WinForms)中,我这样做: ICustomerService customerService = MyService.GetService(); ICustomerList customerList = customerService.GetCustomers(); CustomerService类如下所示: public class CustomerService : ICustomerService { public ICustomerList GetCustomers() { return _customerDataProvider.GetCustomers(); } } public class CustomerDataProvider() { public ICustomerList GetCustomers() { // Open SQL connection, // get back a SqlDataReader and iterate it // in the loop write all data into a ICustomer […]

在Dapper中执行带有参数的存储过程

我正在使用Dapper (感谢Sam ,很棒的项目。)带有DAL的微型ORM,由于某种原因,我无法使用输入参数执行存储过程。 在某种服务中,我有这样的事情: public void GetSomething(int somethingId) { IRepository repository = UnitOfWork.GetRepository(); var param = new DynamicParameters(); param.Add(“@somethingId”, dbType: DbType.Int32, value:somethingId, direction: ParameterDirection.Input); var result = repository.Exec(SomethingEnum.spMyStoredProcedure, param); … } 当存储过程的执行发生时,抛出SqlException声明我需要提供’somethingId’ 过程或函数’spMyStoredProcedure’需要参数’@somethingId’,这是未提供的。 我的DAL类似于Pencroff的这个github项目。 我在这里错过了什么吗? 更新:我实际上是通过SomethingEnum传递commandType: public class SomethingEnum : EnumBase { public static readonly SomethingEnum spMyStoredProcedure = new SomethingEnum(“spMyStoredProcedure”, “[dbo].[spMyStoredProcedure]”, CommandType.StoredProcedure); public SomethingEnum(string Name, […]

不使用ORM的N层数据库应用程序,UI如何指定数据显示的内容?

我在这里寻找指针和信息,我会做这个CW,因为我怀疑它没有一个正确答案。 这是针对C#的,因此我将在下面对Linq进行一些引用。 我也为这篇长篇大论道歉。 让我在这里总结一下这个问题,然后是完整的问题。 简介:在UI / BLL / DAL / DB 4层应用程序中,如何更改用户界面,以显示更多列(例如在网格中),避免泄漏通过业务逻辑层进入数据访问层,掌握要显示的数据(假设它已经在数据库中)。 让我们假设一个有3(4)层的分层应用程序: 用户界面(UI) 业务逻辑层(BLL) 数据访问层(DAL) 数据库(DB;第4层) 在这种情况下,DAL负责构造SQL语句并对数据库执行它们,返回数据。 “正确”构建这样一个层的唯一方法就是始终“select *”吗? 对我来说这是一个很大的禁忌,但让我解释为什么我在想。 让我们说,对于我的用户界面,我希望显示所有拥有活跃就业记录的员工。 “活跃”是指今天的就业记录包含今天(或者甚至是我可以在用户界面中设定的日期)。 在这种情况下,假设我想向所有这些人发送一封电子邮件,所以我在BLL中有一些代码可以确保我还没有向同一个人发送过电子邮件,等等。 对于BLL,它需要最少量的数据。 也许它调用数据访问层来获取活动员工列表,然后调用以获取它发送的电子邮件列表。 然后它加入这些并构造一个新列表。 也许这可以在数据访问层的帮助下完成,这并不重要。 重要的是,对于业务层,它实际上并不需要太多数据。 也许它只需要每个员工的唯一标识符,对于两个列表,匹配,然后说“这些是活动的那些的唯一标识符,您尚未发送电子邮件到”。 然后我构造DAL代码来构造只检索业务层需要的SQL语句吗? IE浏览器。 只是“SELECT id FROM employees WHERE …”? 那么我该怎么做用户界面呢? 对于用户而言,最好包含更多信息,具体取决于我想发送电子邮件的原因。 例如,我可能想要包括一些基本的联系信息,或者他们工作的部门,或者他们的经理姓名等,而不是说我至少要显示姓名和电子邮件地址信息。 用户界面如何获取该数据? 我是否更改了DAL以确保将足够的数据返回给UI? 我是否更改BLL以确保它为UI返回足够的数据? 如果从DAL返回到BLL的对象或数据结构也可以发送到UI,那么BLL可能不需要进行太多的更改,但是UI的要求会影响超出应该与之通信的层。 。 如果这两个世界在不同的数据结构上运行,则可能必须对两者进行更改。 那么当UI被更改时,为了更进一步帮助用户,通过添加更多列,我需要多深才能更改UI? (假设数据已存在于数据库中,因此不需要进行任何更改。) 提出的一个建议是使用Linq-To-SQL和IQueryable,这样如果DAL处理什么(如在什么类型的数据中)和为什么(如WHERE-clauses中)返回IQueryables,BLL可以可能会将这些内容返回到UI,然后可以构建一个Linq查询来检索所需的数据。 然后,用户界面代码可以拉入所需的列。 这可能会有效,因为使用IQuerables,UI最终会实际执行查询,然后它可以使用“select new {X,Y,Z}”来指定它需要的内容,甚至可以在必要时加入其他表。 这看起来很混乱。 […]

我在理解IQueryable 时遇到了问题

所以我想了解IQueryable 。 我正在阅读的教程建议使用它但不确定为什么。 代码只是使用LINQ to SQL返回一些值。 我过去已经做了很多次,但没有使用IQueryable 为什么在我的函数中使用它返回超过1的值? 这是我的代码: public IQueryable GetItems() { return from item in db.Items where item.IsActive == true orderby item.ItemNumber select item; }

如何在ASP.NET Web应用程序的App_Data文件夹中引用Sqlite db文件?

我目前正在按照ASP.NET最佳模式和实践将我的sqlite db文件存储在App_Data文件夹中。 目前我在webconfig中使用以下内容: 以及代码中的以下内容: public SqliteDAO(string path) { Connection = new System.Data.SQLite.SQLiteConnection(path ); } //… //where path = |DataDirectory|MyDB 它导致sqlite创建一个新的数据库(其中没有表),因此我的数据访问调用都没有工作,因为他们没有找到表名。 如何从WebApplication代码中引用App_Data文件夹中的sqlite db文件? 谢谢!

使用Raven DB的数据访问体系结构

我可以使用哪些数据访问体系结构与Raven DB一起使用? 基本上,我想通过接口分离持久性,所以我不会将下划线存储暴露给上层。 即我不希望我的域看到来自Raven DB的IDocumentStore或IDocumentSession 。 我已经实现了通用存储库模式,这似乎有效。 但是,我不确定这是否是正确的方法。 也许我会去命令查询隔离或其他什么? 你的想法是什么?

你在哪里把SQL语句放在你的c#项目中?

我可能会负责将vb6应用程序移植到c#。 此应用程序是一个与访问数据库交互的Windows应用程序。 数据访问封装在基本业务对象中。 基本上一个表的一个类。 现有的vb6业务对象通过DAO读写DB。 我以前写了几次DAL和ORM,但它们都只针对SQL Server。 这个将需要目标访问和SQL服务器。 在以前的项目中,我会将SQL字符串放在业务对象的私有部分中,并可能将冗余的sql代码(如连接,创建命令)移动到公共基类中以减少代码。 这次,我正在考虑将SQL字符串写入.settings文件或其他键/值类型文本文件。 然后我会编写一个sql实用程序来编辑这个文件,并允许我运行并测试参数化查询。 这些查询将在业务对象中按名称引用,而不是将sql嵌入到代码中。 我知道一种标准方法是为每个目标数据库创建一个DAL,并具有要使用的DAL配置状态。 我真的不想为每个数据库创建两个DAL类。 如果我只是通过keyname引用了正确的查询并且具有正确的连接类型,那么似乎代码会更少。 那么,你们这样做吗? 你怎么会或者你有没有解决这个问题? 什么最适合你? 谢谢!

如何在MVC Controller中实现数据访问层

我知道数据访问层或简单的DAL用于访问和检索数据库中的信息,但我不知道如何在控制器内调用DAL数据。 例如,我在我的DAL中创建了这个静态类,但我不确定如何将它调用到我的控制器,任何帮助或指南都将不胜感激。 DohvatiMetodu是该类的名称。 public static FormInputViewModel DohvatiMetodu() { var viewModel = new FormInputViewModel(); var metoda = new List(); var metodaList = new List(); using (var db = new ApplicationDbContext()) { metoda = db.Metoda.ToList(); } foreach (var metod in metoda) { metodaList.Add(new SelectListItem() {Value = metod.Id.ToString(), Text = metod.Naziv}); } viewModel.KoristenaMetoda = metodaList; return viewModel;

如何在ASP.NET MVC中组织DAL

我正在尝试在asp.net mvc项目中组织数据访问层。 我已经阅读了很多不同的文章,所以我仍然有一些问题要完成这个问题: 我应该为数据库中的每个实体创建存储库实例,还是为所有或一个基本实例创建存储库实例,例如PostRepository可以包含Post , Comment和Tag等实体? 在控制器中,我必须获取一些数据,转换为ViewModel并将其传递到视图中。 这是最好的去处? Services , Controller或其他什么? 如果是Service 。 我应该创建多少服务? 对于每个实体,如果是必要的话,还会转入Controller 3或4服务? 或者也许就像我想在存储库中这样做? (创建一个包含一些存储库计数的公共服务PostService ,带有PostRepository , CommentRepository和TagRepository等存储库)

Dal(带Entity Framework)和Model层进入MVC

首先,我使用EF到Dal层(来自MVC的separeted项目,相同的解决方案)。 EF的EDMX文件生成的模型是Model层的实际模型? 如果是这样,我如何访问这些模型以在MVC的View层中工作? 我认为直接从视图访问数据层以使用这些模型是错误的,如果我使用“我的模型”创建一个模型层并将Dal的模型转换为我的模型……它将是重复的代码。 可能我错了,但大多数都是错的。 用代码第一种方法,我无法弄清楚这一点。