Skip to content

Commit

Permalink
Fix issues with SqlCommandSet not copying Byte Array parameters corre…
Browse files Browse the repository at this point in the history
…ctly
  • Loading branch information
cheenamalhotra committed Dec 24, 2019
1 parent 18bce3c commit 6236fe9
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ internal void Append(SqlCommand command)
if (null != byteValues)
{
int offset = p.Offset;
int size = p.Size;
int size = p.GetActualSize();
int countOfBytes = byteValues.Length - offset;
if ((0 != size) && (size < countOfBytes))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ internal void Append(SqlCommand command)
if (null != byteValues)
{
int offset = p.Offset;
int size = p.Size;
int size = p.GetActualSize;
int countOfBytes = byteValues.Length - offset;
if ((0 != size) && (size < countOfBytes))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@
<Compile Include="SQL\MirroringTest\ConnectionOnMirroringTest.cs" />
<Compile Include="SQL\ParallelTransactionsTest\ParallelTransactionsTest.cs" />
<Compile Include="SQL\SqlBulkCopyTest\CopyWidenNullInexactNumerics.cs" />
<Compile Include="SQL\SqlCommand\SqlCommandSetTest.cs" />
<Compile Include="SQL\SqlCredentialTest\SqlCredentialTest.cs" />
<Compile Include="SQL\SqlSchemaInfoTest\SqlSchemaInfoTest.cs" />
<Compile Include="SQL\SqlStatisticsTest\SqlStatisticsTest.cs" />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.Reflection;
using System.Text;
using Xunit;

namespace Microsoft.Data.SqlClient.ManualTesting.Tests
{
public class SqlCommandSetTest
{
private static Assembly mds = Assembly.GetAssembly(typeof(SqlConnection));

[CheckConnStrSetupFact]
public void TestByteArrayParameters()
{
string tableName = DataTestUtility.GetUniqueName("CMD");
string procName = DataTestUtility.GetUniqueName("CMD");
byte[] bArray = new byte[] { 1, 2, 3 };

using (var connection = new SqlConnection(DataTestUtility.TCPConnectionString))
using (var cmd = new SqlCommand(procName, connection))
{
try
{
connection.Open();

setupByteArrayArtifacts(connection, tableName, procName);

// Insert with SqlCommand
cmd.CommandType = System.Data.CommandType.StoredProcedure;
SqlCommandBuilder.DeriveParameters(cmd);
cmd.Parameters["@array"].Value = bArray;

cmd.ExecuteNonQuery();

//Insert with command Set
var commandSetType = mds.GetType("Microsoft.Data.SqlClient.SqlCommandSet");
var cmdSet = Activator.CreateInstance(commandSetType, true);
commandSetType.GetMethod("Append", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(cmdSet, new object[] { cmd });
commandSetType.GetProperty("Connection", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetSetMethod(true).Invoke(cmdSet, new object[] { connection });
commandSetType.GetMethod("ExecuteNonQuery", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(cmdSet, new object[] { });

cmd.CommandType = System.Data.CommandType.Text;
cmd.CommandText = $"SELECT * FROM {tableName}";
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
SqlBytes byteArray = reader.GetSqlBytes(0);
Assert.Equal(byteArray.Length, bArray.Length);

for (int i = 0; i < bArray.Length; i++)
{
Assert.Equal(bArray[i], byteArray[i]);
}
}
}
}
finally
{
dropByteArrayArtifacts(connection, tableName, procName);
}
}
}

private void dropByteArrayArtifacts(SqlConnection connection, string tableName, string procName)
{
using (SqlCommand cmd = connection.CreateCommand())
{
cmd.CommandText = $"DROP TABLE IF EXISTS {tableName}";
cmd.ExecuteNonQuery();

cmd.CommandText = $"DROP PROCEDURE IF EXISTS {procName}";
cmd.ExecuteNonQuery();
}
}

private void setupByteArrayArtifacts(SqlConnection connection, string tableName, string procName)
{
using (SqlCommand cmd = connection.CreateCommand())
{
cmd.CommandText = $"CREATE TABLE {tableName} (ByteArrayColumn varbinary(max))";
cmd.ExecuteNonQuery();

cmd.CommandText = $"CREATE PROCEDURE {procName} @array varbinary(max) AS BEGIN SET NOCOUNT ON; " +
$"insert into {tableName}(ByteArrayColumn) values(@array) END";
cmd.ExecuteNonQuery();
}
}
}
}

0 comments on commit 6236fe9

Please sign in to comment.