当我尝试插入时,会出现错误“没有足够的值”。
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;
}
答案 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)
将图像保存到数据库有两种选择: