Skip to content

Commit

Permalink
Fixed casting between numeric types in ConcreteTypeCreator
Browse files Browse the repository at this point in the history
Added test for passing DataTable to Stored Procedure in SQL Server
  • Loading branch information
markrendle committed Sep 8, 2011
1 parent a6be1d7 commit b353463
Show file tree
Hide file tree
Showing 8 changed files with 65 additions and 3 deletions.
4 changes: 2 additions & 2 deletions CommonAssemblyInfo.cs
Expand Up @@ -19,6 +19,6 @@
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

[assembly: AssemblyVersion("0.9.5.1")]
[assembly: AssemblyFileVersion("0.9.5.1")]
[assembly: AssemblyVersion("0.9.5.2")]
[assembly: AssemblyFileVersion("0.9.5.2")]

20 changes: 20 additions & 0 deletions Simple.Data.SqlTest/ProcedureTest.cs
Expand Up @@ -3,6 +3,8 @@

namespace Simple.Data.SqlTest
{
using System.Data;

[TestFixture]
public class ProcedureTest
{
Expand Down Expand Up @@ -72,5 +74,23 @@ public void ScalarFunctionIsCalledCorrectly()
var results = db.VarcharAndReturnInt("The answer to everything");
Assert.AreEqual(42, results.ReturnValue);
}

[Test]
public void CallProcedureWithDataTable()
{
var db = DatabaseHelper.Open();
var dataTable = new DataTable();
dataTable.Columns.Add("Value");
dataTable.Rows.Add("One");
dataTable.Rows.Add("Two");
dataTable.Rows.Add("Three");

var actual = db.ReturnStrings(dataTable).ToScalarList<string>();

Assert.AreEqual(3, actual.Count);
Assert.Contains("One", actual);
Assert.Contains("Two", actual);
Assert.Contains("Three", actual);
}
}
}
12 changes: 11 additions & 1 deletion Simple.Data.SqlTest/Resources/DatabaseReset.txt
Expand Up @@ -6,6 +6,8 @@ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GetCu
DROP PROCEDURE [dbo].[GetCustomerAndOrders]
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GetCustomerCount]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[GetCustomerCount]
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ReturnStrings]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[ReturnStrings]
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[VarcharAndReturnInt]'))
DROP FUNCTION [dbo].[VarcharAndReturnInt]
IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[VwCustomers]'))
Expand All @@ -22,7 +24,11 @@ GO
IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'test')
DROP SCHEMA [test]
GO

IF EXISTS (SELECT * FROM sys.types st JOIN sys.schemas ss ON st.schema_id = ss.schema_id WHERE st.name = N'StringList' AND ss.name = N'dbo')
DROP TYPE [dbo].[StringList]
GO
CREATE TYPE [dbo].[StringList] AS TABLE([Value] nvarchar(50) NOT NULL)
GO
CREATE PROCEDURE TestReset
AS
BEGIN
Expand Down Expand Up @@ -206,6 +212,10 @@ BEGIN
RETURN 1
END
GO
CREATE PROCEDURE ReturnStrings(@Strings AS [dbo].[StringList] READONLY)
AS
SELECT Value FROM @Strings
GO
CREATE FUNCTION [dbo].[VarcharAndReturnInt] (@AValue varchar(50)) RETURNS INT AS BEGIN
IF ISNUMERIC(@AValue) = 1
BEGIN
Expand Down
1 change: 1 addition & 0 deletions Simple.Data.SqlTest/Simple.Data.SqlTest.csproj
Expand Up @@ -49,6 +49,7 @@
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
Expand Down
1 change: 1 addition & 0 deletions Simple.Data.UnitTest/Simple.Data.UnitTest.csproj
Expand Up @@ -69,6 +69,7 @@
<Compile Include="BufferedEnumerableTest.cs" />
<Compile Include="ComposerTest.cs" />
<Compile Include="ConcreteCollectionTypeCreatorTest.cs" />
<Compile Include="ConcreteTypeCreatorTest.cs" />
<Compile Include="DatabaseOpenerTest.cs" />
<Compile Include="DictionaryClonerTest.cs" />
<Compile Include="DynamicEnumerableTest.cs" />
Expand Down
1 change: 1 addition & 0 deletions Simple.Data.sln
Expand Up @@ -5,6 +5,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data", "Simple.Data\
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{10F43335-5672-4BDA-91BB-5311C2BFA409}"
ProjectSection(SolutionItems) = preProject
CommonAssemblyInfo.cs = CommonAssemblyInfo.cs
README.md = README.md
EndProjectSection
EndProject
Expand Down
4 changes: 4 additions & 0 deletions Simple.Data/ConcreteTypeCreator.cs
Expand Up @@ -52,6 +52,10 @@ public bool TryCreate(IDictionary<string, object> data, out object result)
continue;
}

if (value != null && propertyInfo.PropertyType != value.GetType() && !propertyInfo.PropertyType.IsEnum)
{
value = Convert.ChangeType(value, propertyInfo.PropertyType);
}
propertyInfo.SetValue(obj, value, null);
anyPropertiesSet = true;
}
Expand Down
25 changes: 25 additions & 0 deletions Simple.Data/SimpleResultSet.cs
Expand Up @@ -101,6 +101,31 @@ public T[] ToArray<T>()
return Cast<T>().ToArray();
}

public IList ToScalarList()
{
return ToScalarEnumerable().ToList();
}

public dynamic[] ToScalarArray()
{
return ToScalarEnumerable().ToArray();
}

public IList<T> ToScalarList<T>()
{
return ToScalarEnumerable().Cast<T>().ToList();
}

public T[] ToScalarArray<T>()
{
return ToScalarEnumerable().Cast<T>().ToArray();
}

private IEnumerable<dynamic> ToScalarEnumerable()
{
return _sourceEnumerator.Current.OfType<IDictionary<string, object>>().Select(dict => dict.Values.FirstOrDefault());
}

public dynamic First()
{
return _sourceEnumerator.Current.First();
Expand Down

0 comments on commit b353463

Please sign in to comment.