首页 > 解决方案 > 使用 C# 应用程序中的 OleDb 在 Oracle 数据库中插入图像

问题描述

我想使用 OleDb 和 C# 应用程序将 PNG 图像插入 OracleDatabase。该表如下所示:

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: 'Command parameter[2]'' 由于符号不匹配或数据溢出以外的原因,无法转换数据值。

OleDbException:“MSDAORA”失败,没有可用的错误消息,结果代码:DB_E_ERRORSOCCURRED(0x80040E21)。

你知道可能是什么问题吗?

谢谢

标签: c#oracleimagebloboledb

解决方案


推荐阅读