如何在c#.net应用程序中的oracle数据库中插入图像

时间:2018-02-02 10:12:33

标签: c# .net oracle

当我尝试插入时,会出现错误“没有足够的值”。

public int CreateAdmin( string product_name, string quality, string quantity, string price, string product_image)
{            
    string connectionString = "User Id=hr;Password=hr;Data Source=localhost:1521/xe";

    OracleConnection orc = new OracleConnection();
    orc.ConnectionString = connectionString; //assign connection
    //OracleDataAdapter da = new OracleDataAdapter();
    orc.Open();

    OracleCommand cmd = new OracleCommand();//object of command
    cmd.Connection = orc;
    cmd.CommandType = CommandType.Text; // declare command type

    cmd.CommandText = "insert into Product values( :b, :c, :d, :a, :p)";

    cmd.Parameters.Add("@b", product_name); //add paramenter
    cmd.Parameters.Add("@c", quality);
    cmd.Parameters.Add("@d", quantity);
    cmd.Parameters.Add("@a", price);
    cmd.Parameters.Add("@p", product_image);

    //da.InsertCommand = cmd;
    int i = cmd.ExecuteNonQuery();
    orc.Close();
    return i;
}

3 个答案:

答案 0 :(得分:1)

你的paramnames是错误的,它们需要命名为你在params中设置的那个 - 你在命令中使用:a,在设置参数时使用@a。参数以@(对于SqlServer)或:(对于OracleServer)开始。

如果你的表的列数多于那些5,你也必须提供它们,否则db不知道在哪里放置给定的参数。 (另外一个auto-inc ID也没问题,如果你的第6列就可以了。)

public int CreateAdmin (string product_name, string quality, string quantity, string price, string product_image)
{
  string connectionString = "User Id=hr;Password=hr;Data Source=localhost:1521/xe";

  using (var orc = new OracleConnection (connectionString))
  {
    using (var cmd = orc.CreateCommand ())
    {
      cmd.CommandType = CommandType.Text; // declare command type

      // Product has exactly 5 or 5 + 1 auto-inc ID column, else provide the
      // column names as well: 
      // insert into Product ( name,qual,quant,price,img ) values( :b, :c, :d, :a, :p)";
      cmd.CommandText = "insert into Product values( :b, :c, :d, :a, :p)";

      cmd.Parameters.Add (":b", product_name); //add paramenter
      cmd.Parameters.Add (":c", quality);
      cmd.Parameters.Add (":d", quantity);
      cmd.Parameters.Add (":a", price);
      cmd.Parameters.Add (":p", product_image);

      //da.InsertCommand = cmd;
      int i = cmd.ExecuteNonQuery ();

      return i;
    }
  }
}

我更改了您的代码以受益于using(var orc = new OracleConnection()) { .... } - 带IDisposables的模式 - 它在离开范围时自动关闭/处置您的连接(命令相同)。

由于Wernfried-Domscheit的评论而编辑:

Oracle需要:@适用于SqlServer) - 此答案how-to-write-parameterized-oracle-insert-query支持它 - 它甚至使用不带:的参数名称 - 所以参数名称可能只是插入"为了"而不是"名称"

答案 1 :(得分:0)

Product表中的列很可能比您在值列表中提供的列多。明确给出列名:

OracleCommand cmd = new OracleCommand();//object of command
cmd.Connection = orc;
cmd.CommandType = CommandType.Text; // declare command type

// explicitly add column names
cmd.CommandText = "insert into Product (product_name, quality, quantity, price, product_image) values( :b, :c, :d, :a, :p)";
cmd.Parameters.Add(":b", product_name); //add paramenter
cmd.Parameters.Add(":c", quality);
cmd.Parameters.Add(":d", quantity);
cmd.Parameters.Add(":a", price);
cmd.Parameters.Add(":p", product_image);
int i = cmd.ExecuteNonQuery();

请更改上述代码中的列名称以匹配表格中的列名称。如果这对您有用,请告诉我们。

修改

正如Patrick Artner在其精心编写的答案中所述,参数名称占位符必须在CommandText中相同,并且在向命令添加参数时。使用OracleCommand时,占位符必须为:,而不是MSDN OracleCommand.Parameters page中所述的@

答案 2 :(得分:0)

将图像保存到数据库有两种选择:

  1. 将图像转换为Base64并将输出字符串保存到数据库
  2. 将您的图像保存为服务器上的文件,并将此图像的路径保存到您的数据库(推荐)