Commit 6b092ad8 authored by mgravell's avatar mgravell

new DbString support

parent b5fa7cf0
...@@ -589,6 +589,15 @@ public static void PackListParameters(IDbCommand command, string namePrefix, obj ...@@ -589,6 +589,15 @@ public static void PackListParameters(IDbCommand command, string namePrefix, obj
foreach (var prop in type.GetProperties().OrderBy(p => p.Name)) foreach (var prop in type.GetProperties().OrderBy(p => p.Name))
{ {
if(prop.PropertyType == typeof(DbString))
{
il.Emit(OpCodes.Ldloc_0); // stack is now [parameters] [typed-param]
il.Emit(OpCodes.Callvirt, prop.GetGetMethod()); // stack is [parameters] [dbstring]
il.Emit(OpCodes.Ldarg_0); // stack is now [parameters] [dbstring] [command]
il.Emit(OpCodes.Ldstr, "@" + prop.Name); // stack is now [parameters] [dbstring] [command] [name]
il.EmitCall(OpCodes.Callvirt, typeof(DbString).GetMethod("AddParameter"), null); // stack is now [parameters]
continue;
}
DbType dbType = LookupDbType(prop.PropertyType); DbType dbType = LookupDbType(prop.PropertyType);
if (dbType == DbType.Xml) if (dbType == DbType.Xml)
{ {
...@@ -1006,12 +1015,12 @@ void SqlMapper.IDynamicParameters.AddParameter(IDbCommand command) ...@@ -1006,12 +1015,12 @@ void SqlMapper.IDynamicParameters.AddParameter(IDbCommand command)
var p = command.CreateParameter(); var p = command.CreateParameter();
var val = param.Value; var val = param.Value;
p.ParameterName = param.Name; p.ParameterName = param.Name;
p.Value = val; p.Value = val ?? DBNull.Value;
p.Direction = param.ParameterDirection; p.Direction = param.ParameterDirection;
var s = val as string; var s = val as string;
if (s != null) if (s != null)
{ {
if (s.Length < 4000) if (s.Length <= 4000)
{ {
p.Size = 4000; p.Size = 4000;
} }
...@@ -1034,4 +1043,32 @@ public T Get<T>(string name) ...@@ -1034,4 +1043,32 @@ public T Get<T>(string name)
return (T)parameters[name].AttachedParam.Value; return (T)parameters[name].AttachedParam.Value;
} }
} }
public sealed class DbString
{
public DbString() { Length = -1; }
public bool IsAnsi { get; set; }
public bool IsFixedLength { get; set; }
public int Length { get; set; }
public string Value { get; set; }
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);
command.Parameters.Add(param);
}
}
} }
...@@ -337,6 +337,31 @@ public void TestMultiMapDynamic() ...@@ -337,6 +337,31 @@ public void TestMultiMapDynamic()
connection.Execute("drop table #Users drop table #Posts"); connection.Execute("drop table #Users drop table #Posts");
} }
class Product
{
public int Id { get; set; }
public string Name { get; set; }
public Category Category { get; set; }
}
class Category
{
public int Id { get; set; }
public string Name { get; set; }
}
public void TestMultiMapWithSplit() // http://stackoverflow.com/q/6056778/23354
{
var sql = @"select 1 as id, 'abc' as name, 2 as id, 'def' as name";
var product = connection.Query<Product, Category, Product>(sql, (prod, cat) =>
{
prod.Category = cat;
return prod;
}).First();
// assertions
product.Id.IsEqualTo(1);
product.Name.IsEqualTo("abc");
product.Category.Id.IsEqualTo(2);
product.Category.Name.IsEqualTo("def");
}
public void TestFieldsAndPrivates() public void TestFieldsAndPrivates()
{ {
var data = connection.Query<TestFieldCaseAndPrivatesEntity>( var data = connection.Query<TestFieldCaseAndPrivatesEntity>(
...@@ -544,6 +569,26 @@ select 1111 ...@@ -544,6 +569,26 @@ select 1111
} }
public void TestDbString()
{
var obj = connection.Query("select datalength(@a) as a, datalength(@b) as b, datalength(@c) as c, datalength(@d) as d, datalength(@e) as e, datalength(@f) as f",
new
{
a = new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true },
b = new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = false },
c = new DbString { Value = "abcde", IsFixedLength = false, Length = 10, IsAnsi = true },
d = new DbString { Value = "abcde", IsFixedLength = false, Length = 10, IsAnsi = false },
e = new DbString { Value = "abcde", IsAnsi = true },
f = new DbString { Value = "abcde", IsAnsi = false },
}).First();
((int)obj.a).IsEqualTo(10);
((int)obj.b).IsEqualTo(20);
((int)obj.c).IsEqualTo(5);
((int)obj.d).IsEqualTo(10);
((int)obj.e).IsEqualTo(5);
((int)obj.f).IsEqualTo(10);
}
class Person class Person
{ {
public int PersonId { get; set; } public int PersonId { get; set; }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment