Вставьте изображение в базу данных Oracle, используя OleDb из приложения C# - PullRequest
0 голосов
/ 07 февраля 2020

Я хочу вставить изображение PNG в OracleDatabase с помощью OleDb и приложения C#. Таблица выглядит следующим образом:

CREATE TABLE Plant
(
    Id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
    Name VARCHAR2(50) NOT NULL,
    Image BLOB null,
    CONSTRAINT plant_pk PRIMARY KEY (Id)
);

Ниже приведен код:

public static void AddBinaryParameterToCommand(OleDbCommand cmd, string parameterColumn, object parameter)
        {
            if (cmd != null)
            {
                if (parameter != null && !parameter.ToString().Equals(""))
                {
                    OleDbParameter blobParameter = new OleDbParameter();
                    blobParameter.OleDbType = OleDbType.LongVarBinary;
                    blobParameter.Direction = ParameterDirection.InputOutput;
                    blobParameter.ParameterName = parameterColumn;
                    blobParameter.Value = parameter;

                    cmd.Parameters.Add(blobParameter);
                }

                else
                    cmd.Parameters.Add(new OleDbParameter(parameterColumn, DBNull.Value));
            }
        }

       public int InsertPlant(string name, byte[] image)
        {
            int id = 0;
            using (var connection = new OleDbConnection(ConnectionString))
            {
                var commandGetIdText = @"SELECT MAX(id) FROM PLANT";

                connection.Open();
                using (var command = new OleDbCommand(commandGetIdText, connection))
                {
                    using (var reader = command.ExecuteReader())
                    {
                        reader.Read();
                        id = int.Parse(reader[0].ToString()) + 1;
                    }
                }

                var commandText = string.Format("INSERT INTO PLANT(ID,NAME,IMAGE) VALUES (?, ?, ?)");
                using (var command = new OleDbCommand(commandText, connection))
                {
                    Utils.AddParameterToCommand(command, "ID", id);
                    Utils.AddParameterToCommand(command, "NAME", name);
                    Utils.AddBinaryParameterToCommand(command, "IMAGE", image);

                    command.ExecuteNonQuery();
                    connection.Close();
                }
            }


            return id;
        }

 private void button_UploadMap_Click(object sender, EventArgs e)
        {
            var openFileDialog = new OpenFileDialog
            {
                Multiselect = true
            };

            var path = string.Empty;
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                path = openFileDialog.FileName;
            }
            else
            {
                return;
            }

            byte[] imageArray = File.ReadAllBytes(path);

            var palletMapDL = new PalletMapDL("Data Source=192.168.1.21/orcl;Persist Security Info=True; Password=test;User ID=test; Provider=MSDAORA; OLEDB.NET=True; PLSQLRSet=1");
            palletMapDL.InsertPlant("Test Plant 01", imageArray);

При выполнении command.ExecuteNonQuery (); Я получил это сообщение об ошибке:

System.InvalidOperationException: 'Параметр команды [2]' 'значение данных не может быть преобразовано по причинам, отличным от несоответствия знака или переполнения данных.

OleDbException : «MSDAORA» не выполнен, сообщение об ошибке отсутствует, код результата: DB_E_ERRORSOCCURRED (0x80040E21).

Знаете ли вы, в чем может быть проблема?

Спасибо

...