无法转换类型为#System; Int32'的对象输入' Oracle.DataAccess.Client.OracleParameter'

时间:2016-08-06 10:18:03

标签: c# oracle oracle11g

我正在使用oracle函数将c#windows窗体中的数据插入到我的oracle数据库中,当然我需要使用" Oracle Data Access Component" oracle文档说,十进制数据类型C#等于oracle数据库中的数字数据类型列。

以下代码有什么问题!

  

无法转换类型为#System; Int32'的对象输入   ' Oracle.DataAccess.Client.OracleParameter'

string connstr = @"Data Source=orcl; User Id=user; password=admin;";

string insertcmdtxt = @"F_INSERT_ORDER_DATA";   //~ F_INSERT_ORDER_DATA ~//

using (OracleConnection conn = new OracleConnection(connstr))
using (OracleCommand cmd = new OracleCommand(insertcmdtxt, conn))
{
    try
    {
        conn.Open();

        cmd.CommandType = CommandType.StoredProcedure;

        cmd.CommandText = insertcmdtxt;

        cmd.Parameters.Add(new OracleParameter("P_CUSTOMER_ID", OracleDbType.Decimal).Value = TB_CUSTOMER_ID.Text);

        cmd.Parameters.Add(new OracleParameter("P_NOTES", OracleDbType.Varchar2).Value = TB_NOTES.Text);
        cmd.Parameters.Add(":vORDER_ID", OracleDbType.Varchar2, ParameterDirection.ReturnValue);

        cmd.ExecuteNonQuery();


        TB_INVOICE_ID.Text = (cmd.Parameters[":vORDER_ID"].Value).ToString();
    }
    catch (Exception EX)
    {
        textBox1.Text = insertcmdtxt;
        MessageBox.Show(EX.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        textBox1.Text = EX.Message;
        return;
    }
}

3 个答案:

答案 0 :(得分:0)

Value = 1000返回一个整数,Add方法需要一个OracleParameter类型的对象。您有两个选项,要么将初始化与设置值分开:

var paramCustomerId = new OracleParameter("P_CUSTOMER_ID", OracleDbType.Decimal);
paramCustomerId.Value = Decimal.Parse(TB_CUSTOMER_ID.Text);

cmd.Parameters.Add(paramCustomerId);

或者作为一种可读性不高的快捷方式,您可以这样做:

var paramCustID = new OracleParameter("P_CUSTOMER_ID", OracleDbType.Decimal);
cmd.Parameters.Add(paramCustID).Value = Decimal.Parse(TB_CUSTOMER_ID.Text);

您需要对其他2个参数执行相同的操作。

答案 1 :(得分:0)

我认为这是你想要做的事情

cmd.Parameters.Add(new OracleParameter("P_CUSTOMER_ID", OracleDbType.Decimal)).Value = 1000;
cmd.Parameters.Add(new OracleParameter("P_NOTES", OracleDbType.Varchar2)).Value = TB_NOTES.Text;

注意右括号)

的位置差异

答案 2 :(得分:0)

你无法像这样调用Add的原因是赋值表达式的类型:当你写

something = 123

(在这种情况下,something是新创建的对象的Value属性)赋值表达式的类型是要分配的值的类型,即int。< / p>

您应该可以使用初始化语法来完成它:

cmd.Parameters.Add(
    new OracleParameter("P_CUSTOMER_ID", OracleDbType.Decimal) {
        Value = 1000M // "M" makes decimal
    }
);

现在,表达式的类型仍为OracleParameter,您可以继续进行通话。

您可以通过为其添加int后缀,将值的类型从decimal更改为M