Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
D
Dapper
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
tsai
Dapper
Commits
ac7b9f5a
Commit
ac7b9f5a
authored
Aug 15, 2017
by
Nick Craver
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'netstandard2' of
https://github.com/StackExchange/Dapper
into netstandard2
parents
ba641f18
a9560b31
Changes
17
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
360 additions
and
295 deletions
+360
-295
Dapper.StrongName.csproj
Dapper.StrongName/Dapper.StrongName.csproj
+3
-2
Dapper.Tests.Contrib.csproj
Dapper.Tests.Contrib/Dapper.Tests.Contrib.csproj
+1
-1
TestSuite.cs
Dapper.Tests.Contrib/TestSuite.cs
+2
-4
AsyncTests.cs
Dapper.Tests/AsyncTests.cs
+25
-18
ConstructorTests.cs
Dapper.Tests/ConstructorTests.cs
+0
-79
Dapper.Tests.csproj
Dapper.Tests/Dapper.Tests.csproj
+1
-1
DataReaderTests.cs
Dapper.Tests/DataReaderTests.cs
+27
-23
NullTests.cs
Dapper.Tests/NullTests.cs
+1
-0
ParameterTests.cs
Dapper.Tests/ParameterTests.cs
+101
-40
EntityFrameworkTests.cs
Dapper.Tests/Providers/EntityFrameworkTests.cs
+1
-0
SqliteTests.cs
Dapper.Tests/Providers/SqliteTests.cs
+32
-28
TypeHandlerTests.cs
Dapper.Tests/TypeHandlerTests.cs
+156
-72
Dapper.csproj
Dapper/Dapper.csproj
+3
-2
SqlDataRecordHandler.cs
Dapper/SqlDataRecordHandler.cs
+0
-2
SqlDataRecordListTVPParameter.cs
Dapper/SqlDataRecordListTVPParameter.cs
+1
-15
SqlMapper.cs
Dapper/SqlMapper.cs
+4
-6
appveyor.yml
appveyor.yml
+2
-2
No files found.
Dapper.StrongName/Dapper.StrongName.csproj
View file @
ac7b9f5a
...
...
@@ -22,7 +22,7 @@
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' ">
<PackageReference Include="System.Collections.Concurrent" Version="4.3.0" />
<PackageReference Include="System.Collections.NonGeneric" Version="4.3.0" />
<PackageReference Include="System.Data.
Common
" Version="4.3.0" />
<PackageReference Include="System.Data.
SqlClient
" Version="4.3.0" />
<PackageReference Include="System.Dynamic.Runtime" Version="4.3.0" />
<PackageReference Include="System.Reflection.Emit" Version="4.3.0" />
<PackageReference Include="System.Reflection.Emit.Lightweight" Version="4.3.0" />
...
...
@@ -31,7 +31,8 @@
<PackageReference Include="System.Xml.XmlDocument" Version="4.3.0" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
<PackageReference Include="System.Data.SqlClient" Version="4.4.0-preview1-25305-02" />
<PackageReference Include="System.Data.Common" Version="4.3.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.4.0-preview2-25405-01" />
<PackageReference Include="System.Reflection.Emit" Version="4.3.0" />
<PackageReference Include="System.Reflection.Emit.Lightweight" Version="4.3.0" />
</ItemGroup>
...
...
Dapper.Tests.Contrib/Dapper.Tests.Contrib.csproj
View file @
ac7b9f5a
...
...
@@ -19,7 +19,7 @@
<PackageReference Include="Microsoft.Data.Sqlite" Version="1.1.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" />
<PackageReference Include="MySql.Data" Version="7.0.7-m61" />
<PackageReference Include="System.Data.SqlClient" Version="4.4.0-preview
1-25305-02
" />
<PackageReference Include="System.Data.SqlClient" Version="4.4.0-preview
2-25405-01
" />
<PackageReference Include="xunit" Version="2.3.0-beta1-build3642" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.0-beta1-build1309" />
<DotNetCliToolReference Include="dotnet-xunit" Version="2.3.0-beta1-build3642" />
...
...
Dapper.Tests.Contrib/TestSuite.cs
View file @
ac7b9f5a
...
...
@@ -5,10 +5,8 @@
using
Dapper.Contrib.Extensions
;
#if !NETCOREAPP1_0
using
System.Transactions
;
#endif
#if !NETCOREAPP1_0 && !NETCOREAPP2_0
using
System.Transactions
;
using
System.Data.SqlServerCe
;
#endif
using
FactAttribute
=
Dapper
.
Tests
.
Contrib
.
SkippableFactAttribute
;
...
...
@@ -527,7 +525,7 @@ public void Transactions()
}
}
#if !NETCOREAPP1_0
#if !NETCOREAPP1_0
&& !NETCOREAPP2_0
[
Fact
]
public
void
TransactionScope
()
{
...
...
Dapper.Tests/AsyncTests.cs
View file @
ac7b9f5a
...
...
@@ -353,28 +353,35 @@ public void RunSequentialVersusParallelSync()
Console
.
WriteLine
(
"Pipeline: {0}ms"
,
watch
.
ElapsedMilliseconds
);
}
[
Fact
]
public
void
AssertNoCacheWorksForQueryMultiple
()
[
Collection
(
"QueryCacheTests"
)
]
public
class
AsyncQueryCacheTests
:
TestBase
{
const
int
a
=
123
,
b
=
456
;
var
cmdDef
=
new
CommandDefinition
(
@"select @a; select @b;"
,
new
{
a
,
b
},
commandType
:
CommandType
.
Text
,
flags
:
CommandFlags
.
NoCache
);
private
SqlConnection
_marsConnection
;
private
SqlConnection
MarsConnection
=>
_marsConnection
??
(
_marsConnection
=
GetOpenConnection
(
true
));
int
c
,
d
;
SqlMapper
.
PurgeQueryCache
();
int
before
=
SqlMapper
.
GetCachedSQLCount
();
using
(
var
multi
=
MarsConnection
.
QueryMultiple
(
cmdDef
))
[
Fact
]
public
void
AssertNoCacheWorksForQueryMultiple
()
{
c
=
multi
.
Read
<
int
>().
Single
();
d
=
multi
.
Read
<
int
>().
Single
();
const
int
a
=
123
,
b
=
456
;
var
cmdDef
=
new
CommandDefinition
(
@"select @a; select @b;"
,
new
{
a
,
b
},
commandType
:
CommandType
.
Text
,
flags
:
CommandFlags
.
NoCache
);
int
c
,
d
;
SqlMapper
.
PurgeQueryCache
();
int
before
=
SqlMapper
.
GetCachedSQLCount
();
using
(
var
multi
=
MarsConnection
.
QueryMultiple
(
cmdDef
))
{
c
=
multi
.
Read
<
int
>().
Single
();
d
=
multi
.
Read
<
int
>().
Single
();
}
int
after
=
SqlMapper
.
GetCachedSQLCount
();
before
.
IsEqualTo
(
0
);
after
.
IsEqualTo
(
0
);
c
.
IsEqualTo
(
123
);
d
.
IsEqualTo
(
456
);
}
int
after
=
SqlMapper
.
GetCachedSQLCount
();
before
.
IsEqualTo
(
0
);
after
.
IsEqualTo
(
0
);
c
.
IsEqualTo
(
123
);
d
.
IsEqualTo
(
456
);
}
private
class
BasicType
...
...
Dapper.Tests/ConstructorTests.cs
View file @
ac7b9f5a
...
...
@@ -104,85 +104,6 @@ public bool GetWentThroughProperConstructor()
}
}
[
Fact
]
public
void
Issue461_TypeHandlerWorksInConstructor
()
{
SqlMapper
.
AddTypeHandler
(
new
Issue461_BlargHandler
());
connection
.
Execute
(
@"CREATE TABLE #Issue461 (
Id int not null IDENTITY(1,1),
SomeValue nvarchar(50),
SomeBlargValue nvarchar(200),
)"
);
const
string
Expected
=
"abc123def"
;
var
blarg
=
new
Blarg
(
Expected
);
connection
.
Execute
(
"INSERT INTO #Issue461 (SomeValue, SomeBlargValue) VALUES (@value, @blarg)"
,
new
{
value
=
"what up?"
,
blarg
});
// test: without constructor
var
parameterlessWorks
=
connection
.
QuerySingle
<
Issue461_ParameterlessTypeConstructor
>(
"SELECT * FROM #Issue461"
);
parameterlessWorks
.
Id
.
IsEqualTo
(
1
);
parameterlessWorks
.
SomeValue
.
IsEqualTo
(
"what up?"
);
parameterlessWorks
.
SomeBlargValue
.
Value
.
IsEqualTo
(
Expected
);
// test: via constructor
var
parameterDoesNot
=
connection
.
QuerySingle
<
Issue461_ParameterisedTypeConstructor
>(
"SELECT * FROM #Issue461"
);
parameterDoesNot
.
Id
.
IsEqualTo
(
1
);
parameterDoesNot
.
SomeValue
.
IsEqualTo
(
"what up?"
);
parameterDoesNot
.
SomeBlargValue
.
Value
.
IsEqualTo
(
Expected
);
}
// I would usually expect this to be a struct; using a class
// so that we can't pass unexpectedly due to forcing an unsafe cast - want
// to see an InvalidCastException if it is wrong
private
class
Blarg
{
public
Blarg
(
string
value
)
{
Value
=
value
;
}
public
string
Value
{
get
;
}
public
override
string
ToString
()
{
return
Value
;
}
}
private
class
Issue461_BlargHandler
:
SqlMapper
.
TypeHandler
<
Blarg
>
{
public
override
void
SetValue
(
IDbDataParameter
parameter
,
Blarg
value
)
{
parameter
.
Value
=
((
object
)
value
.
Value
)
??
DBNull
.
Value
;
}
public
override
Blarg
Parse
(
object
value
)
{
string
s
=
(
value
==
null
||
value
is
DBNull
)
?
null
:
Convert
.
ToString
(
value
);
return
new
Blarg
(
s
);
}
}
private
class
Issue461_ParameterlessTypeConstructor
{
public
int
Id
{
get
;
set
;
}
public
string
SomeValue
{
get
;
set
;
}
public
Blarg
SomeBlargValue
{
get
;
set
;
}
}
private
class
Issue461_ParameterisedTypeConstructor
{
public
Issue461_ParameterisedTypeConstructor
(
int
id
,
string
someValue
,
Blarg
someBlargValue
)
{
Id
=
id
;
SomeValue
=
someValue
;
SomeBlargValue
=
someBlargValue
;
}
public
int
Id
{
get
;
}
public
string
SomeValue
{
get
;
}
public
Blarg
SomeBlargValue
{
get
;
}
}
public
static
class
AbstractInheritance
{
public
abstract
class
Order
...
...
Dapper.Tests/Dapper.Tests.csproj
View file @
ac7b9f5a
...
...
@@ -23,7 +23,7 @@
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" />
<PackageReference Include="MySql.Data" Version="7.0.7-m61" />
<PackageReference Include="Npgsql" Version="3.2.2" />
<PackageReference Include="System.Data.SqlClient" Version="4.4.0-preview
1-25305-02
" />
<PackageReference Include="System.Data.SqlClient" Version="4.4.0-preview
2-25405-01
" />
<PackageReference Include="System.ValueTuple" Version="4.3.0" />
<PackageReference Include="xunit" Version="2.3.0-beta1-build3642" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.0-beta1-build1309" />
...
...
Dapper.Tests/DataReaderTests.cs
View file @
ac7b9f5a
...
...
@@ -6,36 +6,40 @@ namespace Dapper.Tests
{
public
partial
class
DataReaderTests
:
TestBase
{
[
Fact
]
public
void
GetSameReaderForSameShape
()
[
Collection
(
"QueryCacheTests"
)
]
public
class
DataReaderQueryCacheTests
:
TestBase
{
var
origReader
=
connection
.
ExecuteReader
(
"select 'abc' as Name, 123 as Id"
);
var
origParser
=
origReader
.
GetRowParser
(
typeof
(
HazNameId
));
[
Fact
]
public
void
GetSameReaderForSameShape
()
{
var
origReader
=
connection
.
ExecuteReader
(
"select 'abc' as Name, 123 as Id"
);
var
origParser
=
origReader
.
GetRowParser
(
typeof
(
HazNameId
));
var
typedParser
=
origReader
.
GetRowParser
<
HazNameId
>();
var
typedParser
=
origReader
.
GetRowParser
<
HazNameId
>();
ReferenceEquals
(
origParser
,
typedParser
).
IsEqualTo
(
true
);
ReferenceEquals
(
origParser
,
typedParser
).
IsEqualTo
(
true
);
var
list
=
origReader
.
Parse
<
HazNameId
>().
ToList
();
list
.
Count
.
IsEqualTo
(
1
);
list
[
0
].
Name
.
IsEqualTo
(
"abc"
);
list
[
0
].
Id
.
IsEqualTo
(
123
);
origReader
.
Dispose
();
var
list
=
origReader
.
Parse
<
HazNameId
>().
ToList
();
list
.
Count
.
IsEqualTo
(
1
);
list
[
0
].
Name
.
IsEqualTo
(
"abc"
);
list
[
0
].
Id
.
IsEqualTo
(
123
);
origReader
.
Dispose
();
var
secondReader
=
connection
.
ExecuteReader
(
"select 'abc' as Name, 123 as Id"
);
var
secondParser
=
secondReader
.
GetRowParser
(
typeof
(
HazNameId
));
var
thirdParser
=
secondReader
.
GetRowParser
(
typeof
(
HazNameId
),
1
);
var
secondReader
=
connection
.
ExecuteReader
(
"select 'abc' as Name, 123 as Id"
);
var
secondParser
=
secondReader
.
GetRowParser
(
typeof
(
HazNameId
));
var
thirdParser
=
secondReader
.
GetRowParser
(
typeof
(
HazNameId
),
1
);
list
=
secondReader
.
Parse
<
HazNameId
>().
ToList
();
list
.
Count
.
IsEqualTo
(
1
);
list
[
0
].
Name
.
IsEqualTo
(
"abc"
);
list
[
0
].
Id
.
IsEqualTo
(
123
);
secondReader
.
Dispose
();
list
=
secondReader
.
Parse
<
HazNameId
>().
ToList
();
list
.
Count
.
IsEqualTo
(
1
);
list
[
0
].
Name
.
IsEqualTo
(
"abc"
);
list
[
0
].
Id
.
IsEqualTo
(
123
);
secondReader
.
Dispose
();
// now: should be different readers, but same parser
ReferenceEquals
(
origReader
,
secondReader
).
IsEqualTo
(
false
);
ReferenceEquals
(
origParser
,
secondParser
).
IsEqualTo
(
true
);
ReferenceEquals
(
secondParser
,
thirdParser
).
IsEqualTo
(
false
);
// now: should be different readers, but same parser
ReferenceEquals
(
origReader
,
secondReader
).
IsEqualTo
(
false
);
ReferenceEquals
(
origParser
,
secondParser
).
IsEqualTo
(
true
);
ReferenceEquals
(
secondParser
,
thirdParser
).
IsEqualTo
(
false
);
}
}
[
Fact
]
...
...
Dapper.Tests/NullTests.cs
View file @
ac7b9f5a
...
...
@@ -2,6 +2,7 @@
using
System.Linq
;
namespace
Dapper.Tests
{
[
Collection
(
"QueryCacheTests"
)]
public
class
NullTests
:
TestBase
{
[
Fact
]
...
...
Dapper.Tests/ParameterTests.cs
View file @
ac7b9f5a
...
...
@@ -38,6 +38,24 @@ void SqlMapper.IDynamicParameters.AddParameters(IDbCommand command, SqlMapper.Id
}
}
private
static
List
<
Microsoft
.
SqlServer
.
Server
.
SqlDataRecord
>
CreateSqlDataRecordList
(
IEnumerable
<
int
>
numbers
)
{
var
number_list
=
new
List
<
Microsoft
.
SqlServer
.
Server
.
SqlDataRecord
>();
// Create an SqlMetaData object that describes our table type.
Microsoft
.
SqlServer
.
Server
.
SqlMetaData
[]
tvp_definition
=
{
new
Microsoft
.
SqlServer
.
Server
.
SqlMetaData
(
"n"
,
SqlDbType
.
Int
)
};
foreach
(
int
n
in
numbers
)
{
// Create a new record, using the metadata array above.
var
rec
=
new
Microsoft
.
SqlServer
.
Server
.
SqlDataRecord
(
tvp_definition
);
rec
.
SetInt32
(
0
,
n
);
// Set the value.
number_list
.
Add
(
rec
);
// Add it to the list.
}
return
number_list
;
}
private
class
IntDynamicParam
:
SqlMapper
.
IDynamicParameters
{
private
readonly
IEnumerable
<
int
>
numbers
;
...
...
@@ -51,19 +69,8 @@ public void AddParameters(IDbCommand command, SqlMapper.Identity identity)
var
sqlCommand
=
(
SqlCommand
)
command
;
sqlCommand
.
CommandType
=
CommandType
.
StoredProcedure
;
var
number_list
=
new
List
<
Microsoft
.
SqlServer
.
Server
.
SqlDataRecord
>();
// Create an SqlMetaData object that describes our table type.
Microsoft
.
SqlServer
.
Server
.
SqlMetaData
[]
tvp_definition
=
{
new
Microsoft
.
SqlServer
.
Server
.
SqlMetaData
(
"n"
,
SqlDbType
.
Int
)
};
foreach
(
int
n
in
numbers
)
{
// Create a new record, using the metadata array above.
var
rec
=
new
Microsoft
.
SqlServer
.
Server
.
SqlDataRecord
(
tvp_definition
);
rec
.
SetInt32
(
0
,
n
);
// Set the value.
number_list
.
Add
(
rec
);
// Add it to the list.
}
var
number_list
=
CreateSqlDataRecordList
(
numbers
);
// Add the table parameter.
var
p
=
sqlCommand
.
Parameters
.
Add
(
"ints"
,
SqlDbType
.
Structured
);
p
.
Direction
=
ParameterDirection
.
Input
;
...
...
@@ -85,19 +92,8 @@ public void AddParameter(IDbCommand command, string name)
var
sqlCommand
=
(
SqlCommand
)
command
;
sqlCommand
.
CommandType
=
CommandType
.
StoredProcedure
;
var
number_list
=
new
List
<
Microsoft
.
SqlServer
.
Server
.
SqlDataRecord
>();
// Create an SqlMetaData object that describes our table type.
Microsoft
.
SqlServer
.
Server
.
SqlMetaData
[]
tvp_definition
=
{
new
Microsoft
.
SqlServer
.
Server
.
SqlMetaData
(
"n"
,
SqlDbType
.
Int
)
};
foreach
(
int
n
in
numbers
)
{
// Create a new record, using the metadata array above.
var
rec
=
new
Microsoft
.
SqlServer
.
Server
.
SqlDataRecord
(
tvp_definition
);
rec
.
SetInt32
(
0
,
n
);
// Set the value.
number_list
.
Add
(
rec
);
// Add it to the list.
}
var
number_list
=
CreateSqlDataRecordList
(
numbers
);
// Add the table parameter.
var
p
=
sqlCommand
.
Parameters
.
Add
(
name
,
SqlDbType
.
Structured
);
p
.
Direction
=
ParameterDirection
.
Input
;
...
...
@@ -218,7 +214,6 @@ public void TestMassiveStrings()
.
IsEqualTo
(
str
);
}
#if !NETCOREAPP1_0
[
Fact
]
public
void
TestTVPWithAnonymousObject
()
{
...
...
@@ -289,19 +284,8 @@ public new void AddParameters(IDbCommand command, SqlMapper.Identity identity)
var
sqlCommand
=
(
SqlCommand
)
command
;
sqlCommand
.
CommandType
=
CommandType
.
StoredProcedure
;
var
number_list
=
new
List
<
Microsoft
.
SqlServer
.
Server
.
SqlDataRecord
>();
// Create an SqlMetaData object that describes our table type.
Microsoft
.
SqlServer
.
Server
.
SqlMetaData
[]
tvp_definition
=
{
new
Microsoft
.
SqlServer
.
Server
.
SqlMetaData
(
"n"
,
SqlDbType
.
Int
)
};
foreach
(
int
n
in
numbers
)
{
// Create a new record, using the metadata array above.
var
rec
=
new
Microsoft
.
SqlServer
.
Server
.
SqlDataRecord
(
tvp_definition
);
rec
.
SetInt32
(
0
,
n
);
// Set the value.
number_list
.
Add
(
rec
);
// Add it to the list.
}
var
number_list
=
CreateSqlDataRecordList
(
numbers
);
// Add the table parameter.
var
p
=
sqlCommand
.
Parameters
.
Add
(
"ints"
,
SqlDbType
.
Structured
);
p
.
Direction
=
ParameterDirection
.
Input
;
...
...
@@ -344,6 +328,83 @@ public void TestTVPWithAdditionalParams()
}
}
[
Fact
]
public
void
TestSqlDataRecordListParametersWithAsTableValuedParameter
()
{
try
{
connection
.
Execute
(
"CREATE TYPE int_list_type AS TABLE (n int NOT NULL PRIMARY KEY)"
);
connection
.
Execute
(
"CREATE PROC get_ints @integers int_list_type READONLY AS select * from @integers"
);
var
records
=
CreateSqlDataRecordList
(
new
int
[]
{
1
,
2
,
3
});
var
nums
=
connection
.
Query
<
int
>(
"get_ints"
,
new
{
integers
=
records
.
AsTableValuedParameter
()
},
commandType
:
CommandType
.
StoredProcedure
).
ToList
();
nums
.
IsSequenceEqualTo
(
new
int
[]
{
1
,
2
,
3
});
nums
=
connection
.
Query
<
int
>(
"select * from @integers"
,
new
{
integers
=
records
.
AsTableValuedParameter
(
"int_list_type"
)
}).
ToList
();
nums
.
IsSequenceEqualTo
(
new
int
[]
{
1
,
2
,
3
});
try
{
connection
.
Query
<
int
>(
"select * from @integers"
,
new
{
integers
=
records
.
AsTableValuedParameter
()
}).
First
();
throw
new
InvalidOperationException
();
}
catch
(
Exception
ex
)
{
ex
.
Message
.
Equals
(
"The table type parameter 'ids' must have a valid type name."
);
}
}
finally
{
try
{
connection
.
Execute
(
"DROP PROC get_ints"
);
}
finally
{
connection
.
Execute
(
"DROP TYPE int_list_type"
);
}
}
}
[
Fact
]
public
void
TestSqlDataRecordListParametersWithTypeHandlers
()
{
try
{
connection
.
Execute
(
"CREATE TYPE int_list_type AS TABLE (n int NOT NULL PRIMARY KEY)"
);
connection
.
Execute
(
"CREATE PROC get_ints @integers int_list_type READONLY AS select * from @integers"
);
// Variable type has to be IEnumerable<SqlDataRecord> for TypeHandler to kick in.
IEnumerable
<
Microsoft
.
SqlServer
.
Server
.
SqlDataRecord
>
records
=
CreateSqlDataRecordList
(
new
int
[]
{
1
,
2
,
3
});
var
nums
=
connection
.
Query
<
int
>(
"get_ints"
,
new
{
integers
=
records
},
commandType
:
CommandType
.
StoredProcedure
).
ToList
();
nums
.
IsSequenceEqualTo
(
new
int
[]
{
1
,
2
,
3
});
try
{
connection
.
Query
<
int
>(
"select * from @integers"
,
new
{
integers
=
records
}).
First
();
throw
new
InvalidOperationException
();
}
catch
(
Exception
ex
)
{
ex
.
Message
.
Equals
(
"The table type parameter 'ids' must have a valid type name."
);
}
}
finally
{
try
{
connection
.
Execute
(
"DROP PROC get_ints"
);
}
finally
{
connection
.
Execute
(
"DROP TYPE int_list_type"
);
}
}
}
#if !NETCOREAPP1_0
[
Fact
]
public
void
DataTableParameters
()
{
...
...
Dapper.Tests/Providers/EntityFrameworkTests.cs
View file @
ac7b9f5a
...
...
@@ -4,6 +4,7 @@
namespace
Dapper.Tests.Providers
{
[
Collection
(
"TypeHandlerTests"
)]
public
class
EntityFrameworkTests
:
TestBase
{
public
EntityFrameworkTests
()
...
...
Dapper.Tests/Providers/SqliteTests.cs
View file @
ac7b9f5a
...
...
@@ -24,41 +24,45 @@ public void DapperEnumValue_Sqlite()
}
}
[
FactSqlite
]
public
void
Issue466_SqliteHatesOptimizations
()
[
Collection
(
"TypeHandlerTests"
)
]
public
class
SqliteTypeHandlerTests
:
TestBase
{
using
(
var
connection
=
GetSQLiteConnection
())
[
FactSqlite
]
public
void
Issue466_SqliteHatesOptimizations
()
{
SqlMapper
.
ResetTypeHandlers
();
var
row
=
connection
.
Query
<
HazNameId
>(
"select 42 as Id"
).
First
();
row
.
Id
.
IsEqualTo
(
42
);
row
=
connection
.
Query
<
HazNameId
>(
"select 42 as Id"
).
First
();
row
.
Id
.
IsEqualTo
(
42
);
using
(
var
connection
=
GetSQLiteConnection
())
{
SqlMapper
.
ResetTypeHandlers
();
var
row
=
connection
.
Query
<
HazNameId
>(
"select 42 as Id"
).
First
();
row
.
Id
.
IsEqualTo
(
42
);
row
=
connection
.
Query
<
HazNameId
>(
"select 42 as Id"
).
First
();
row
.
Id
.
IsEqualTo
(
42
);
SqlMapper
.
ResetTypeHandlers
();
row
=
connection
.
QueryFirst
<
HazNameId
>(
"select 42 as Id"
);
row
.
Id
.
IsEqualTo
(
42
);
row
=
connection
.
QueryFirst
<
HazNameId
>(
"select 42 as Id"
);
row
.
Id
.
IsEqualTo
(
42
);
SqlMapper
.
ResetTypeHandlers
();
row
=
connection
.
QueryFirst
<
HazNameId
>(
"select 42 as Id"
);
row
.
Id
.
IsEqualTo
(
42
);
row
=
connection
.
QueryFirst
<
HazNameId
>(
"select 42 as Id"
);
row
.
Id
.
IsEqualTo
(
42
);
}
}
}
[
FactSqlite
]
public
async
Task
Issue466_SqliteHatesOptimizations_Async
()
{
using
(
var
connection
=
GetSQLiteConnection
())
[
FactSqlite
]
public
async
Task
Issue466_SqliteHatesOptimizations_Async
()
{
SqlMapper
.
ResetTypeHandlers
();
var
row
=
(
await
connection
.
QueryAsync
<
HazNameId
>(
"select 42 as Id"
).
ConfigureAwait
(
false
)).
First
();
row
.
Id
.
IsEqualTo
(
42
);
row
=
(
await
connection
.
QueryAsync
<
HazNameId
>(
"select 42 as Id"
).
ConfigureAwait
(
false
)).
First
();
row
.
Id
.
IsEqualTo
(
42
);
using
(
var
connection
=
GetSQLiteConnection
())
{
SqlMapper
.
ResetTypeHandlers
();
var
row
=
(
await
connection
.
QueryAsync
<
HazNameId
>(
"select 42 as Id"
).
ConfigureAwait
(
false
)).
First
();
row
.
Id
.
IsEqualTo
(
42
);
row
=
(
await
connection
.
QueryAsync
<
HazNameId
>(
"select 42 as Id"
).
ConfigureAwait
(
false
)).
First
();
row
.
Id
.
IsEqualTo
(
42
);
SqlMapper
.
ResetTypeHandlers
();
row
=
await
connection
.
QueryFirstAsync
<
HazNameId
>(
"select 42 as Id"
).
ConfigureAwait
(
false
);
row
.
Id
.
IsEqualTo
(
42
);
row
=
await
connection
.
QueryFirstAsync
<
HazNameId
>(
"select 42 as Id"
).
ConfigureAwait
(
false
);
row
.
Id
.
IsEqualTo
(
42
);
SqlMapper
.
ResetTypeHandlers
();
row
=
await
connection
.
QueryFirstAsync
<
HazNameId
>(
"select 42 as Id"
).
ConfigureAwait
(
false
);
row
.
Id
.
IsEqualTo
(
42
);
row
=
await
connection
.
QueryFirstAsync
<
HazNameId
>(
"select 42 as Id"
).
ConfigureAwait
(
false
);
row
.
Id
.
IsEqualTo
(
42
);
}
}
}
...
...
Dapper.Tests/TypeHandlerTests.cs
View file @
ac7b9f5a
This diff is collapsed.
Click to expand it.
Dapper/Dapper.csproj
View file @
ac7b9f5a
...
...
@@ -17,7 +17,7 @@
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' ">
<PackageReference Include="System.Collections.Concurrent" Version="4.3.0" />
<PackageReference Include="System.Collections.NonGeneric" Version="4.3.0" />
<PackageReference Include="System.Data.
Common
" Version="4.3.0" />
<PackageReference Include="System.Data.
SqlClient
" Version="4.3.0" />
<PackageReference Include="System.Dynamic.Runtime" Version="4.3.0" />
<PackageReference Include="System.Reflection.Emit" Version="4.3.0" />
<PackageReference Include="System.Reflection.Emit.Lightweight" Version="4.3.0" />
...
...
@@ -26,7 +26,8 @@
<PackageReference Include="System.Xml.XmlDocument" Version="4.3.0" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
<PackageReference Include="System.Data.SqlClient" Version="4.4.0-preview1-25305-02" />
<PackageReference Include="System.Data.Common" Version="4.3.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.4.0-preview2-25405-01" />
<PackageReference Include="System.Reflection.Emit" Version="4.3.0" />
<PackageReference Include="System.Reflection.Emit.Lightweight" Version="4.3.0" />
</ItemGroup>
...
...
Dapper/SqlDataRecordHandler.cs
View file @
ac7b9f5a
...
...
@@ -2,7 +2,6 @@
using
System.Collections.Generic
;
using
System.Data
;
#if !NETSTANDARD1_3
namespace
Dapper
{
internal
sealed
class
SqlDataRecordHandler
:
SqlMapper
.
ITypeHandler
...
...
@@ -18,4 +17,3 @@ public void SetValue(IDbDataParameter parameter, object value)
}
}
}
#
endif
\ No newline at end of file
Dapper/SqlDataRecordListTVPParameter.cs
View file @
ac7b9f5a
using
System
;
using
System.Collections.Generic
;
using
System.Data
;
using
System.Reflection
;
#if !NETSTANDARD1_3
namespace
Dapper
{
/// <summary>
...
...
@@ -23,18 +22,6 @@ public SqlDataRecordListTVPParameter(IEnumerable<Microsoft.SqlServer.Server.SqlD
this
.
typeName
=
typeName
;
}
private
static
readonly
Action
<
System
.
Data
.
SqlClient
.
SqlParameter
,
string
>
setTypeName
;
static
SqlDataRecordListTVPParameter
()
{
var
prop
=
typeof
(
System
.
Data
.
SqlClient
.
SqlParameter
).
GetProperty
(
nameof
(
System
.
Data
.
SqlClient
.
SqlParameter
.
TypeName
),
BindingFlags
.
Instance
|
BindingFlags
.
Public
);
if
(
prop
!=
null
&&
prop
.
PropertyType
==
typeof
(
string
)
&&
prop
.
CanWrite
)
{
setTypeName
=
(
Action
<
System
.
Data
.
SqlClient
.
SqlParameter
,
string
>)
Delegate
.
CreateDelegate
(
typeof
(
Action
<
System
.
Data
.
SqlClient
.
SqlParameter
,
string
>),
prop
.
GetSetMethod
());
}
}
void
SqlMapper
.
ICustomQueryParameter
.
AddParameter
(
IDbCommand
command
,
string
name
)
{
var
param
=
command
.
CreateParameter
();
...
...
@@ -54,4 +41,3 @@ internal static void Set(IDbDataParameter parameter, IEnumerable<Microsoft.SqlSe
}
}
}
#
endif
\ No newline at end of file
Dapper/SqlMapper.cs
View file @
ac7b9f5a
...
...
@@ -219,24 +219,22 @@ private static void ResetTypeHandlers(bool clone)
typeHandlers
=
new
Dictionary
<
Type
,
ITypeHandler
>();
#if !NETSTANDARD1_3
AddTypeHandlerImpl
(
typeof
(
DataTable
),
new
DataTableHandler
(),
clone
);
#endif
try
{
AddSqlDataRecordsTypeHandler
(
clone
);
}
catch
{
/* https://github.com/StackExchange/dapper-dot-net/issues/424 */
}
#endif
AddTypeHandlerImpl
(
typeof
(
XmlDocument
),
new
XmlDocumentHandler
(),
clone
);
AddTypeHandlerImpl
(
typeof
(
XDocument
),
new
XDocumentHandler
(),
clone
);
AddTypeHandlerImpl
(
typeof
(
XElement
),
new
XElementHandler
(),
clone
);
}
#if !NETSTANDARD1_3
[
MethodImpl
(
MethodImplOptions
.
NoInlining
)]
private
static
void
AddSqlDataRecordsTypeHandler
(
bool
clone
)
{
AddTypeHandlerImpl
(
typeof
(
IEnumerable
<
Microsoft
.
SqlServer
.
Server
.
SqlDataRecord
>),
new
SqlDataRecordHandler
(),
clone
);
}
#endif
/// <summary>
/// Configure the specified type to be mapped to a given db-type.
...
...
@@ -3662,15 +3660,15 @@ public static void SetTypeName(this DataTable table, string typeName)
/// <param name="table">The <see cref="DataTable"/> that has a type name associated with it.</param>
public
static
string
GetTypeName
(
this
DataTable
table
)
=>
table
?.
ExtendedProperties
[
DataTableTypeNameKey
]
as
string
;
#endif
/// <summary>
/// Used to pass a IEnumerable<SqlDataRecord> as a
<see cref="TableValuedParameter"/>
.
/// Used to pass a IEnumerable<SqlDataRecord> as a
TableValuedParameter
.
/// </summary>
/// <param name="list">Th
h
e list of records to convert to TVPs.</param>
/// <param name="list">The list of records to convert to TVPs.</param>
/// <param name="typeName">The sql parameter type name.</param>
public
static
ICustomQueryParameter
AsTableValuedParameter
(
this
IEnumerable
<
Microsoft
.
SqlServer
.
Server
.
SqlDataRecord
>
list
,
string
typeName
=
null
)
=>
new
SqlDataRecordListTVPParameter
(
list
,
typeName
);
#endif
// one per thread
[
ThreadStatic
]
...
...
appveyor.yml
View file @
ac7b9f5a
image
:
Visual Studio 2017
image
:
Visual Studio 2017
Preview
skip_branch_with_pr
:
true
skip_tags
:
true
...
...
@@ -52,4 +52,4 @@ deploy:
branch
:
master
api_key
:
secure
:
P/UHxq2DEs0GI1SoDXDesHjRVsSVgdywz5vmsnhFQQY5aJgO3kP+QfhwfhXz19Rw
symbol_server
:
https://www.myget.org/F/stackoverflow/symbols/api/v2/package
\ No newline at end of file
symbol_server
:
https://www.myget.org/F/stackoverflow/symbols/api/v2/package
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment