OleDbConnection: Вставка байта[] в большой двоичный объект не сохраняет изменения

#c# #oracle #visual-studio #oledb

Вопрос:

Я пытаюсь обновить записи с помощью OleDbConnection. Данные, которые я хотел обновить, в массиве байтов, будут храниться в виде большого двоичного объекта в oracle. Однако, когда строка попадает в ExecuteNonQuery , ничего не меняется

Что я пробовал:

Я думал, что была проблема с самим запросом. Поэтому я попробовал следующее:

1: Проверьте с помощью другого запроса:

 @"UPDATE dcmnts 
             SET TestCol = ?
             where BUSNSS_ID = ?";
 

Запустив это, программа TestCol была успешно обновлена. Это столбец varchar

2: Убедился, что привязка в том же порядке отображается в запросе, что и вопросительные знаки, тоже не сработало

3: Поставьте a Console.WriteLine в конце, и он предложит: «1 строка с обновлением 12345678», поэтому он обновляется, но когда я проверяю разработчика Oracle, Summary_SPOD столбец по-прежнему равен нулю

     public void SaveSPODLetter(byte[] Letter, string TrackingNumber )
    {
        string query = @"UPDATE dcmnts 
                         SET SUMMARY_SPOD = ?
                         where BUSNSS_ID = ?";
        OleDbCommand command = null;
        string ConnString = ConfigurationManager.ConnectionStrings["My_db"].ToString();

        using (OleDbConnection connection = new OleDbConnection(BaseEncryptor.DecryptString(ConnString)))
        {
            try
            {
                if (connection.State != ConnectionState.Open)
                    connection.Open();
                command = new OleDbCommand(query, connection);
                command.Parameters.Add(new OleDbParameter("SUMMARY_SPOD", Letter));
                command.Parameters.Add(new OleDbParameter("BUSNSS_ID", TrackingNumber));
                int rowUpdate = command.ExecuteNonQuery();
                Console.WriteLine($"{rowUpdate} row with {TrackingNumber} updated");
            }
            finally
            {
                if (command != null) { command.Dispose(); command = null; }
            }
        }
    }
 

Я не уверен, почему он все еще показывает ошибку, связано ли это с тем фактом, что Letter это массив байтов?

Комментарии:

1. пробовать command.Parameters.Add("Letter", OleDbType.VarBinary).Value = Letter;

2. @Иззи то же самое, к сожалению

Ответ №1:

Я не уверен, считается ли это решением, но, похоже, это связано с OleDB.

Я так и не понял, почему, поэтому переключился Oracle.DataAccess.Client и соответствующим образом изменил все функции. После этого это сработало.

 public void SaveSPODLetter(byte[] Letter, string TrackingNumber )
{
    string query = @"UPDATE dcmnts 
                     SET SUMMARY_SPOD = :Summary_SPOD
                     where BUSNSS_ID = :BUSNSS_ID";
    OracleCommand command = null;
    string ConnString = ConfigurationManager.ConnectionStrings["My_db"].ToString();

    using (OracleConnection connection = new OracleConnection(BaseEncryptor.DecryptString(ConnString)))
    {
        try
        {
            if (connection.State != ConnectionState.Open)
                connection.Open();
            command = new OracleCommand(query, connection);
            command.Parameters.Add(new OracleParameter("Summary_SPOD", Letter));
            command.Parameters.Add(new OracleParameter("BUSNSS_ID", TrackingNumber));
            command.ExecuteNonQuery();
            //Console.WriteLine($"{rowUpdate} row with {TrackingNumber} updated");
        }
        finally
        {
            if (command != null) { command.Dispose(); command = null; }
        }
    }
}