public void SetsNullValueWhenEnumerableIsEmpty()
        {
            var cmd = new Mock <IDbCommand>();

            cmd.Setup(c => c.CreateParameter()).Returns(new SqlParameter());

            var toTest = new TableValuedParameter("Foo", new TVP2[0], typeof(TVP2), "CustomInt", "Schema");

            var res = toTest.CreateDbDataParameter(cmd.Object);

            res.DbType.Should().Be(DbType.Object, "table valued parameters pass DbType.Object");
            res.ParameterName.Should().Be("Foo", "it was passed in the constructor");
            res.Direction.Should().Be(ParameterDirection.Input, "it is an input parameter");
            res.Value.Should().BeNull();

            var typed = res.Should().BeOfType <SqlParameter>().Which;

            typed.SqlDbType.Should().Be(SqlDbType.Structured, "table valued parameters are Structured");
            typed.TypeName.Should().Be("[Schema].[CustomInt]", "it was passed in the constructor");
            typed.Value.Should().BeNull();
        }
        public void IgnoresSetOnlyProperties()
        {
            var cmd = new Mock <IDbCommand>();

            cmd.Setup(c => c.CreateParameter()).Returns(new SqlParameter());

            var toTest = new TableValuedParameter("Foo", new[] { new TVP2(42) }, typeof(TVP2), "CustomInt", "Schema");

            var res = toTest.CreateDbDataParameter(cmd.Object);

            res.DbType.Should().Be(DbType.Object, "table valued parameters pass DbType.Object");
            res.ParameterName.Should().Be("Foo", "it was passed in the constructor");
            res.Direction.Should().Be(ParameterDirection.Input, "it is an input parameter");

            var typed = res.Should().BeOfType <SqlParameter>().Which;

            typed.SqlDbType.Should().Be(SqlDbType.Structured, "table valued parameters are Structured");
            typed.TypeName.Should().Be("[Schema].[CustomInt]", "it was passed in the constructor");

            var meta = typed.Value.Should().BeAssignableTo <IEnumerable <SqlDataRecord> >().Which.Single();

            meta.FieldCount.Should().Be(1, "only one row was passed in");
            meta.GetInt32(0).Should().Be(42, "it was passed in the row");
        }
        public void SetsConstructorDataTableOnParameter()
        {
            var cmd = new Mock <IDbCommand>();

            cmd.Setup(c => c.CreateParameter()).Returns(new SqlParameter());
            var dt = new DataTable();

            dt.Columns.Add("Int", typeof(int));
            dt.Rows.Add(42);

            var toTest = new TableValuedParameter("Foo", dt, "CustomInt", "Schema");

            var res = toTest.CreateDbDataParameter(cmd.Object);

            res.DbType.Should().Be(DbType.Object, "table valued parameters pass DbType.Object");
            res.ParameterName.Should().Be("Foo", "it was passed in the constructor");
            res.Direction.Should().Be(ParameterDirection.Input, "it is an input parameter");

            var typed = res.Should().BeOfType <SqlParameter>().Which;

            typed.SqlDbType.Should().Be(SqlDbType.Structured, "table valued parameters are Structured");
            typed.TypeName.Should().Be("[Schema].[CustomInt]", "it was passed in the constructor");
            typed.Value.Should().Be(dt);
        }