我需要ntext
在 Dapper 中支持 SQL Server CE 的类型。这里有一个线程描述了这个问题:
https ://code.google.com/p/dapper-dot-net/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Priority%20Milestone %20Owner%20总结&groupby=&sort=&id=110
我试图修改 Dapper 以使用类似于 PetaPoco 中使用的方法的解决方案: https ://github.com/cyotek/PetaPoco/commit/ea13add473be3899ebb73b463d2aff98f8d6d06e
在查看了 Dapper 的源代码后,我决定尝试这样做的一个好方法可能是修改DbString
类。我将AddParameter(IDbCommand command, string name)
方法(从第 3120 行开始)更改为以下内容:
public void AddParameter(IDbCommand command, string name)
{
if (IsFixedLength && Length == -1)
{
throw new InvalidOperationException("If specifying IsFixedLength, a Length must also be specified");
}
var param = command.CreateParameter();
param.ParameterName = name;
param.Value = (object)Value ?? DBNull.Value;
if (Length == -1 && Value != null && Value.Length <= 4000)
{
param.Size = 4000;
}
else
{
param.Size = Length;
}
param.DbType = IsAnsi ? (IsFixedLength ? DbType.AnsiStringFixedLength : DbType.AnsiString) : (IsFixedLength ? DbType.StringFixedLength : DbType.String);
if (param.Value != null)
{
if (param.Value.ToString().Length + 1 > 4000 && param.GetType().Name == "SqlCeParameter")
{
param.GetType().GetProperty("SqlDbType").SetValue(param, System.Data.SqlDbType.NText, null);
}
}
command.Parameters.Add(param);
}
我的编辑是检查类型并尝试将其更改为底部的部分ntext
。但是,当我运行此代码时,IIS Express 崩溃并且 asp.net 没有给我任何有用的调试信息。我试图在调试器中运行它,但我收到了与堆损坏相关的错误。
我在这里走错了吗?有没有更好的方法在 Dapper 中尝试这样的事情?还是因为缓存和/或 IL 的生成方式而无法正常工作?如果我能让它工作,我希望为它创建一个拉取请求,但我正在罢工。
更新 - 我找到了一种潜在的解决方案。AddParameters(IDbCommand command, SqlMapper.Identity identity)
我在类的方法中添加了一些代码DynamicParameters
。该方法的最后几行现在为:
if (s != null)
{
if (s.Length + 1 > 4000 && p.GetType().Name == "SqlCeParameter")
{
p.GetType().GetProperty("SqlDbType").SetValue(p, SqlDbType.NText, null);
p.Size = s.Length;
}
}
if (add)
{
command.Parameters.Add(p);
}
param.AttachedParam = p;
为了使用这个解决方案,我必须将我的参数添加为 DynamicParameters。所以它有效,但不是以最有用的方式。我仍在寻找更好的解决方案。
如果我创建拉取请求,Dapper 开发人员是否会考虑将其作为补丁包含在内?