Tag: dapper

如何使用dapper映射多个列表

我有三个用户,订单和项目类存储在单个表中。 订单和项目都与用户有关系。 为了实现这一点,我有两个映射这些关系的crosstables(UserOrders,UserProjects)。 public class User { public string UserID {get;set;} public List Orders{get;set;} public List Projects {get;set;} } public class Order { public string OrderID {get;set} … } public class Project { public string ProjectID {get;set} … } 如您所见,User对象包含每个相关orderID / projectID的列表。 现在我想用Dapper查询。 我有这个解决方案,只有一个列表工作得很好。 但是如果我尝试查询第二个列表的完整用户对象,我将得到每个结果乘以第一个列表中的结果数。 因此,如果用户获得3个订单和2个项目,则订单列表将很好,项目列表将包含两个项目3次: var lookup = new Dictionary(); var multi = dbDapperFM.Query(“SELECT […]

非法尝试使用Text / Byte主变量 – 插入TEXT列

尝试通过Dapper插入表(文本列),并从Informix获取错误: Illegal attempt to use Text/Byte host variable 我已经编写了一个小程序来模拟这个,我仍然面临着问题。 我们目前无法使用Informix驱动程序,因为它们不适合我们的需求。 using Dapper; using System; using System.Data.Odbc; namespace DapperParamsTest { class Program { static void Main(string[] args) { OdbcConnection conn = new System.Data.Odbc.OdbcConnection(“Driver={IBM INFORMIX ODBC DRIVER (64-bit)}; Host=bylgia; Server=bylgia; Service=sqlexec; Protocol=onsoctcp; Database=DATABASE; Client_Locale=en_US.CP1252; DB_LOCALE=en_GB.1252”); var dynParams = new DynamicParameters(); dynParams.Add(“np_c_ref”,-1); dynParams.Add(“np_np_type”,”T”); dynParams.Add(“np_text”, System.Text.Encoding.Default.GetBytes(“TEXT INPUT”), System.Data.DbType.Binary); conn.Execute(“INSERT […]

为什么Dapper无法返回多个插入的行ID?

我有一个SQL Server表,其中插入行使用: var sql = @” DECLARE @InsertedRows AS TABLE (Id BIGINT); INSERT INTO Person ([Name], [Age]) OUTPUT Inserted.Id INTO @InsertedRows VALUES (@Name, @Age); SELECT Id FROM @InsertedRows;”; Person person = …; var id = connection.Query(sql, person).First(); 这一切都很好,但是如果我尝试插入多个项目并使用以下命令返回所有插入的ID: IEnumerable people = …; var ids = connection.Query(sql, people); 我收到一个错误: System.InvalidOperationException:在此上下文中不允许使用可枚举的参数序列(数组,列表等) 在Dapper.SqlMapper.GetCacheInfo(身份标识,对象exampleParameters,布尔addToCache) 在Dapper.SqlMapper.d__23`1.MoveNext() —从抛出exception的先前位置开始的堆栈跟踪结束— 如何在Dapper中返回多个插入的ID?

使用具有特定精度的十进制作为Dapper的输出参数

我正在评估Dapper作为自定义和繁琐代码的替代品,到目前为止,所有这些都是非常好的和有希望的。 但今天早上我偶然发现了动态参数的问题,无法找到解决方案。 存储过程为客户计算帐户余额和可用余额,以两个十进制输出参数返回其结果。 这些小数在存储过程中声明,其中Precision = 18,Scale = 2。 此过程与当前标准方法完美配合。 但是在Dapper中,我找不到传递这些参数的方法并指定比例,所以我得到的只是十进制值的整数部分。 using (IDbConnection connection = OpenConnection()) { var args = new DynamicParameters(new { custID = customerID}); // No way to set the scale here? args.Add(“@accnt”, dbType: DbType.Decimal, direction: ParameterDirection.Output); args.Add(“@avail”, dbType: DbType.Decimal, direction: ParameterDirection.Output); var results = connection.QueryMultiple(“Customer_CalcBalance”, args, commandType:CommandType.StoredProcedure); decimal account = args.Get(“@accnt”); decimal availab […]

Report Viewer X Dapper

我正在使用Dapper向ReportDataSource提供查询。 但是,我有一个空报告,即使有一个IEnumerable加载数据。 当你花费Datatable工作。 如何使用Dapper for ReportViewer从查询传递数据? this.reportViewer.LocalReport.DataSources.Clear(); DataTable dt = new DataTable(); dt = CN.Query(Sql, param); Microsoft.Reporting.WinForms.ReportDataSource rprtDTSource = new Microsoft.Reporting.WinForms.ReportDataSource(dt.TableName, dt); this.reportViewer.LocalReport.DataSources.Add(rprtDTSource); this.reportViewer.RefreshReport(); –

Dapper.NET如何在内部使用.Count()和SingleOrDefault()?

我是Dapper的新手虽然我知道ORM和DAL并且之前已经使用NHibernate实现了DAL。 示例查询: – string sql = “SELECT * FROM MyTable”; public int GetCount() { var result = Connection.Query(sql).Count(); return result; } Dapper会将此查询(内部)转换为SELECT COUNT(*) FROM MyTable查看.Count()吗? 同样,如果是SingleOrDefault() ,它会转换为SELECT TOP 1 * FROM MyTable吗? 我来自NHibernate世界,它相应地生成查询。 我不确定Dapper。 当我使用MS Access时,我没有看到检查生成的查询的方法。

使用存储过程从Dapper.net查询返回值

我试图using Dapper.Net调用存储过程并获取返回值。 p.Add(“@INCIDENT_ID”, dbType: DbType.Int32, direction: ParameterDirection.ReturnValue); var retResults = con.Execute(“usp_GetIncidentID”, p, commandType:CommandType.StoredProcedure); int IncidentID = p.Get(“INCIDENT_ID”); 我已经尝试了几个不同的参数方向并使用”@INCIDENT_ID” 。 如果单步retResults结果,可以看到正确的返回值在retResults值中下降,但我无法按照下面的文档中描述的方式访问这些值。 存储过程Dapper支持完全存储的过程: var user = cnn.Query(“spGetUser”, new {Id = 1}, commandType: CommandType.StoredProcedure).First();}}} If you want something more fancy, you can do: var p = new DynamicParameters(); p.Add(“@a”, 11); p.Add(“@b”, dbType: DbType.Int32, direction: ParameterDirection.Output); p.Add(“@c”, dbType: DbType.Int32, […]

可以使用Dapper默认使用AnsiStrings吗?

我正在使用Dapper对数据库,其中字符串主要存储在VarChar列中。 默认情况下,Dapper在生成查询时使用NVarChar参数,虽然我可以将我使用的每个字符串参数包装在DbString但默认情况下使用AnsiStrings并使用DbString作为NVarChar案例NVarChar 。 我尝试将Dapper源中的类型映射从DbType.String为DbType.AnsiString但是这似乎导致参数委托的IL生成错误(抛出InvalidProgramException )。 有更简单的方法吗? 更新 只是改变typeMap是不够的我需要改变一些if (dbType == DbType.String)检查。 现在它有效!

通用QueryMultiple与Dapper

我有一个基本存储库,其中包含Generic Get方法,可以使用Dapper返回Data public T Get(Func query) { using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings[“myDB”].ConnectionString)) { return query.Invoke(db); } } 但是我现在需要返回多个数据。 DAL查询如下: var multi = db.QueryMultiple(getCarDataSp , new { CustomerID = customerId, Year = year }, commandType: CommandType.StoredProcedure)); var cars = multi.Read(); var options = multi.Read(); //wire the options to the cars foreach(var car in cars){ var […]

小巧玲珑的简单映射

表: create table Documents (Id int, SomeText varchar(100), CustomerId int, CustomerName varchar(100) ) insert into Documents (Id, SomeText, CustomerId, CustomerName) select 1, ‘1’, 1, ‘Name1’ union all select 2, ‘2’, 2, ‘Name2’ 类别: public class Document { public int Id { get; set; } public string SomeText { get; set; } public Customer { get; […]