views:

509

answers:

3

Does anyone know whether if its possible to insert binary data into an SQL field from c# without using a stored procedure?

For example - convert a byte array into base64 or something like that and then use a text command like the following...

String.Format("update A set B = {0} where C = D", Convert.ToBase64String(b));

where b is a byte array.

Thanks

+3  A: 

Yes, I think you can do it with parameterised queries.

Example found here: http://www.akadia.com/services/dotnet%5Fread%5Fwrite%5Fblob.html

Blorgbeard
+1  A: 

Of course, you should use parameterized statements, but if you really need to, you can do it like this:

String.Format("update A set B = 0x{0} where C = D", BitConverter.ToString(b.Replace("-", ""))
erikkallen
I am getting the following error: "The identifier that starts with 'D312E360A25E2E3CFD30A312030206F626A203C3C2F46696C7465722F466C6174654465636F64652F4C656E677468203333363E3E73747265616D0A789C8551D' is too long. Maximum length is 128.\r\nIncorrect syntax near 'D312E360A25E2E3CFD30A312030206F626A203C3C2F46696C7465722F466C6174654465636F64652F4C656E677468203333363E3E73747265616D0A789C8551D'."
Grant
sorry disregard. forgot to enclose in quotation marks.. thanks!
Grant
Can you tell me how to get the data back into a byte array from a datatable?
Grant
Yes, use a SqlDataReader, it will return the binary as a byte[]
erikkallen
+3  A: 

Try this code, either the command.Parameters that is uncommented or the commented code should work. I use OracleDataClient at work, so I took this code almost completely from MSDN

string commandText= "update A set B = @BIN where C = D";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand(commandText, connection);
    command.Parameters.Add("@BIN", SqlDbType.Binary, b.Length).Value = b;    
    // command.Parameters.AddWithValue("@BIN ", b);

    try
    {
        connection.Open();
        Int32 rowsAffected = command.ExecuteNonQuery();
        Console.WriteLine("RowsAffected: {0}", rowsAffected);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

edit: this assumes b is already byte[]. I just looked at some old code and update the parameter to what worked for me (SQL Server 2005)

Jim Schubert