Загрузка изображения в Oracle Blob с помощью Asp.net MVC 5 и отображение на html-странице - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть очень новое в asp.net, которое просит вас помочь, я пытаюсь загрузить изображение с данными нового пользователя, я могу успешно добавить информацию о пользователе в базу данных. Но сейчас я застрял с загрузкой изображения. Моя форма работает отлично, передавая все данные в действие , поэтому я начинаю оттуда:

public ActionResult SaveUser(string oid, string fname, string uname, string pass, string pass2, string bt, HttpPostedFileBase image)
{


    string iuser = Session["UserID"].ToString();
    string fileName = Path.GetFileName(image.FileName);
    String fileExtension = Path.GetExtension(fileName);
    int fileSize = image.ContentLength;

    if (fileExtension.ToLower() == ".jpg" || fileExtension.ToLower() == ".jpeg")
    {
        Stream stream = image.InputStream;
        BinaryReader binaryReader = new BinaryReader(stream);
        byte[] bytes = binaryReader.ReadBytes((int)stream.Length);
    }


    if (pass == pass2)
    {
        if (bt == "0")
        {
            string packge = "tflhr.pro_new_user.insert_data";
            ds = new DataSet();
            ds = _clsDataAccess.package_user(packge, fname, uname, pass, iuser );

        }

    }

    return RedirectToAction("User", new { cpid = 0, bt = 0 });
}  

В действии image , содержащем изображения, теперь, как я могу загрузить данные изображения в базу данных, вот мое соединение:

public DataSet package_user(string package, string fname, string pass, string uname, byte[] bytes, string iuser)
{
    conn = new OracleConnection(clsConnection.ConnectionSave);
    conn.Open();

    cmd = new OracleCommand(package, conn);
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add("cur_c1", OracleType.Cursor).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("user_name", OracleType.VarChar).Value = fname;
    cmd.Parameters.Add("user_pass", OracleType.VarChar).Value = pass;
    cmd.Parameters.Add("user_enid", OracleType.VarChar).Value = uname;
    cmd.Parameters.Add("user_name", OracleType.Blob).Value = bytes;
    cmd.Parameters.Add("iuser", OracleType.VarChar).Value = iuser;
    cmd.Parameters.Add("euser", OracleType.VarChar).Value = iuser;


    oda = new OracleDataAdapter(cmd);
    ds = new DataSet();

    conn.Close();
    oda.Fill(ds);
    return ds;

}

и процедура хранения:

CREATE OR REPLACE PACKAGE BODY TFLHR.pro_new_user as
procedure insert_data (cur_c1 out t_cursor, user_name in varchar2, user_pass in varchar2,
user_enid in varchar2, bytes in blob, iuser in varchar2, euser in varchar2)
is
code varchar2(5);
begin
select nvl(max(to_number(user_text)),0)+1 into code from tflhr.t_user;
insert into tflhr.t_user (oid, user_text, user_name, user_pass, user_enid,image, iuser, euser,user_path)
values
('USERx'||lpad(code,5,'0'), lpad(code,5,'0'), user_name, user_pass, user_enid, bytes, iuser, euser, lpad(code,5,'0'));
open cur_c1 for
select '1' from dual;
        commit;
    end insert_data;
end;
/

И я получил исключение

Исключительное изображение Как я изменяю этот параметр для загрузки изображения. Пожалуйста, помогите мне и коротко, если есть какая-либо ошибка. Спасибо

1 Ответ

0 голосов
/ 06 сентября 2018

Исключение несколько экземпляров именованного аргумента в списке возникает потому, что вы добавляете одно и то же имя параметра дважды, как показано в этом фрагменте (и имя параметра также неверно в соответствии с типом данных параметра):

cmd.Parameters.Add("user_name", OracleType.VarChar).Value = fname;
cmd.Parameters.Add("user_pass", OracleType.VarChar).Value = pass;
cmd.Parameters.Add("user_enid", OracleType.VarChar).Value = uname;

// user_name parameter used twice here, the exception thrown
cmd.Parameters.Add("user_name", OracleType.Blob).Value = bytes; 

Вы должны добавить bytes имя параметра вместо:

cmd.Parameters.Add("cur_c1", OracleType.Cursor).Direction = ParameterDirection.Output;
cmd.Parameters.Add("user_name", OracleType.VarChar).Value = fname;
cmd.Parameters.Add("user_pass", OracleType.VarChar).Value = pass;
cmd.Parameters.Add("user_enid", OracleType.VarChar).Value = uname;
cmd.Parameters.Add("bytes", OracleType.Blob).Value = bytes; // problem fixed
cmd.Parameters.Add("iuser", OracleType.VarChar).Value = iuser;
cmd.Parameters.Add("euser", OracleType.VarChar).Value = iuser;

Обратите внимание, что вы можете использовать AddWithValue, чтобы упростить определения параметров, но убедитесь, что они переданы с правильными типами данных.

Кроме того, вы должны передавать параметры метода в правильном порядке:

ds = _clsDataAccess.package_user(packge, fname, pass, uname, bytes, iuser);

потому что подпись метода выглядит следующим образом:

public DataSet package_user(string package, string fname, string pass, string uname, byte[] bytes, string iuser)
...