Вставка Bytearray в SQL через хранимую процедуру, вызываемую в C # - PullRequest
1 голос
/ 24 декабря 2011

Прежде всего я попробовал все, и не могу понять, почему он не будет корректно обновлять мое поле varbinary.

из 1728 байтов только последний байт в массиве байтов сохраняется вполе ...

Я генерирую свой байтовый массив следующим образом:

public static byte[] StringToByteArray(String hex)
{
    int NumberChars = hex.Length;
    byte[] bytes = new byte[NumberChars / 2];
    for (int i = 0; i < NumberChars; i += 2)
        bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
    return bytes;
}

Я также попробовал следующий код:

public static byte[] ParseHex(string hex)
{
    int offset = hex.StartsWith("0x") ? 2 : 0;
    if ((hex.Length % 2) != 0)
    {
        throw new ArgumentException("Invalid length: " + hex.Length);
    }
    byte[] ret = new byte[(hex.Length - offset) / 2];

    for (int i = 0; i < ret.Length; i++)
    {
        ret[i] = (byte)((ParseNybble(hex[offset]) << 4)
                         | ParseNybble(hex[offset + 1]));
        offset += 2;
    }
    return ret;
}

static int ParseNybble(char c)
{
    if (c >= '0' && c <= '9')
    {
        return c - '0';
    }
    if (c >= 'A' && c <= 'F')
    {
        return c - 'A' + 10;
    }
    if (c >= 'a' && c <= 'f')
    {
        return c - 'a' + 10;
    }
    throw new ArgumentException("Invalid hex digit: " + c);
}

Мой код C # для сохраненияданные таковы:

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DB_Conn"].ConnectionString))
{
  byte[] to_store = StringToByteArray(inventory);

  //State the Stored Proc and add Values to 'cmd' to pass to the Stored Proc
  SqlCommand cmd = new SqlCommand("_USP_store", conn);
  cmd.CommandType = CommandType.StoredProcedure;
  cmd.Parameters.AddWithValue("@A", TB_A.Text);
  cmd.Parameters.Add("@B", SqlDbType.VarBinary, 1728).Value = to_store;

  try
  {
    // Open Connection and execute Stored Proc
    conn.Open();
    cmd.ExecuteNonQuery();
    C2_Wipe_Message.Text = "Storing success";
    C2_Wipe_Message.ForeColor = Color.FromArgb(0, 0, 255, 0);

  }
  catch
  {
    C2_Wipe_Message.Text = "An error occured..";
    C2_Wipe_Message.ForeColor = Color.FromArgb(0, 255, 0, 0);
  }
  finally
  {
    if (conn.State == System.Data.ConnectionState.Open)
    {
      //Close connection IF open
      conn.Close();
    }
  }
}

Я отправил его в виде строки, отправил в виде простого двоичного файла, отправил в виде шестнадцатеричного байтового массива и т. д.

Мое предположение - использовать цикл while в sql, чтобы сохранить его, но это не объясняет, почему последний байт всегда сохраняется вместо первого байта массива байтов. Пожалуйста, просветите меня, потому что это бесит ..

* SQL SP

@A varchar(10),
@B varbinary(1728)

    AS  

UPDATE Invenotry
SET A = @B
WHERE (Name = @A)

1 Ответ

3 голосов
/ 24 декабря 2011

Ваш sql должен быть таким:

UPDATE Invenotry
SET B = @B
WHERE A = @A

Вы также можете попробовать полную версию конструктора параметра:

SqlParamter param = new SqlParameter("@B", SqlDbType.VarBinary, 1728, ParameterDirection.Input, 
     // we have these parameters but they are ignored for input types
     false, 0, 0, null, DataRowVersion.Current, 
     // the data
     to_store);

cmd.Parameters.Add(param);
...