繁体   English   中英

C# ORA-01008: 并非所有变量都绑定错误

[英]C# ORA-01008: not all variables bound error

我是第一次使用 C#,现在我尝试将数据从变量插入到 oracle db。 但我收到了这个错误。 我不知道这个源代码有什么意义。

    public class Foo
    {
        public string PLANTCODE { get; set; }
        public string LOCATIONCODE { get; set; }
        public string LOCATIONNAME { get; set; }
        public string LOCATIONSTATUS { get; set; }
        public string DEPARTMENTCODE { get; set; }
        public string DEPARTMENTNAME { get; set; }
      //  public DateTime LASTUPDATED { get; set; }
       // public OracleDbType OracleDbType { get; set; }

    }
    public List<Foo> GetData()
    {
        List<Foo> dataList = new List<Foo>();
        string connectionString = "Data Source=xxx; Initial Catalog=xxx;Integrated Security = false; User ID=xxx;Password=xxx";
        string selectStatement = "SELECT PLANTCODE,LOCATIONCODE,LOCATIONNAME,LOCATIONSTATUS,DEPARTMENTCODE,DEPARTMENTNAME from V_Location";

        using (var con = new SqlConnection(connectionString))
        {
            using (var cmd = new SqlCommand(selectStatement, con))
            {
                con.Open();

                using (var reader = cmd.ExecuteReader())
                { if (reader.Read())

                        {
                            dataList.Add(new Foo
                            {
                                PLANTCODE = reader.GetString(0),
                                LOCATIONCODE = reader.GetString(1),
                                LOCATIONNAME = reader.GetString(2),
                                LOCATIONSTATUS = reader.GetString(3),
                                DEPARTMENTCODE = reader.GetString(4),
                                DEPARTMENTNAME = reader.GetString(5),
                            });
                        }
                 }
            }
        }
        return dataList;
    }
    public void InsertData()
    {


        string connectionString = "Provider=MSDAORA;Data Source=ORCL;Persist Security Info=True;User ID=xxx;Password=xxx;Unicode=True";
        string insertStatment = "INSERT INTO xxx.BTH_V_LOCATION (PLANTCODE, LOCATIONCODE, LOCATIONNAME, LOCATIONSTATUS, DEPARTMENTCODE, DEPARTMENTNAME) VALUES (:PLANTCODE, :LOCATIONCODE, :LOCATIONNAME, :LOCATIONSTATUS, :DEPARTMENTCODE, :DEPARTMENTNAME)";


        List<Foo> dataList = GetData();

        if (dataList.Count > 0)
        {
            using (OleDbConnection con = new OleDbConnection(connectionString))
            {

                    using (OleDbCommand cmd = new OleDbCommand(insertStatment, con))
                    {
                        con.Open();
                        foreach (var items in dataList)
                        {


                            cmd.Parameters.Clear();
                            cmd.Parameters.Add("PLANTCODE", OleDbType.VarChar).Value = items.PLANTCODE;
                            cmd.Parameters.Add("LOCATIONCODE", OleDbType.VarChar).Value = items.LOCATIONCODE;
                            cmd.Parameters.Add("LOCATIONNAME", OleDbType.VarChar).Value = items.LOCATIONNAME;
                            cmd.Parameters.Add("LOCATIONSTATUS", OleDbType.VarChar).Value = items.LOCATIONSTATUS;
                            cmd.Parameters.Add("DEPARTMENTCODE", OleDbType.VarChar).Value = items.DEPARTMENTCODE;
                            cmd.Parameters.Add("DEPARTMENTNAME", OleDbType.VarChar).Value = items.DEPARTMENTNAME;


                        }

                        cmd.ExecuteNonQuery();
                    }

            }
        }

    }
    private void button1_Click_1(object sender, EventArgs e)
    {

        InsertData();

    }





}

}

此源代码首先从 sql server 获取选择数据。 之后将数据保存在变量中以插入到oracle。 现在我尝试在没有变量的情况下插入然后可以插入数据。 但是如果我更改为按变量插入但无法插入并出现此错误

ORA-01008: “cmd.ExecuteNonQuery(); 上并非所有变量都绑定错误”

移动 cmd.Parameters.clear(); 在循环之外。

似乎每次都在清理。

非常感谢您的回答,但我尝试移动 cmd.Parameters.clear(); ,我仍然遇到同样的错误。

using (OleDbConnection con = new OleDbConnection(connectionString))  //OleDbConnection
            {

                using (OleDbCommand cmd = new OleDbCommand(insertStatment, con))  //OleDbCommand
                    {
                        con.Open();
                        foreach (var items in dataList)
                        {
                            cmd.Parameters.Add("PLANTCODE", OleDbType.VarChar).Value = items.PLANTCODE;
                            cmd.Parameters.Add("LOCATIONCODE", OleDbType.VarChar).Value = items.LOCATIONCODE;
                            cmd.Parameters.Add("LOCATIONNAME", OleDbType.VarChar).Value = items.LOCATIONNAME;
                            cmd.Parameters.Add("LOCATIONSTATUS", OleDbType.VarChar).Value = items.LOCATIONSTATUS;
                            cmd.Parameters.Add("DEPARTMENTCODE", OleDbType.VarChar).Value = items.DEPARTMENTCODE;
                            cmd.Parameters.Add("DEPARTMENTNAME", OleDbType.VarChar).Value = items.DEPARTMENTNAME;
                         }
                     cmd.ExecuteNonQuery();
                     cmd.Parameters.Clear();
                    }
            } 

我尝试交换“cmd.ExecuteNonQuery();” 和“cmd.Parameters.Clear();” 但同样的结果。

现在我可以解决这个问题,我将参数名称更改为“?”

 string insertStatment = "INSERT INTO xxx.BTH_V_LOCATION (PLANTCODE, LOCATIONCODE, LOCATIONNAME, LOCATIONSTATUS, DEPARTMENTCODE, DEPARTMENTNAME) VALUES (?,?,?,?,?,?)";
        List<Foo> dataList = GetData();
        if (dataList.Count > 0)
        {
            using (OleDbConnection con2 = new OleDbConnection(connectionString))  //OleDbConnection
            {

                using (OleDbCommand cmd2 = new OleDbCommand(insertStatment, con2))  //OleDbCommand
                    {
                        con2.Open();
                        cmd2.Parameters.Clear();
                        foreach (var items in dataList)
                        {
                            cmd2.Parameters.Add("?", OleDbType.VarChar).Value = items.PLANTCODE;
                            cmd2.Parameters.Add("?", OleDbType.VarChar).Value = items.LOCATIONCODE;
                            cmd2.Parameters.Add("?", OleDbType.VarChar).Value = items.LOCATIONNAME;
                            cmd2.Parameters.Add("?", OleDbType.VarChar).Value = items.LOCATIONSTATUS;
                            cmd2.Parameters.Add("?", OleDbType.VarChar).Value = items.DEPARTMENTCODE;
                            cmd2.Parameters.Add("?", OleDbType.VarChar).Value = items.DEPARTMENTNAME;
                            //cmd2.ExecuteNonQuery();
                            //cmd2.Parameters.Clear();
                         }
                     cmd2.ExecuteNonQuery();
                     //cmd2.Parameters.Clear();
                    }
               } 
           }

我认为您需要使用@而不是:作为参数。 并且您需要在循环内执行并在执行后清除参数。

string insertStatment = "INSERT INTO xxx.BTH_V_LOCATION (PLANTCODE, LOCATIONCODE, LOCATIONNAME, LOCATIONSTATUS, DEPARTMENTCODE, DEPARTMENTNAME) VALUES (@PLANTCODE, @LOCATIONCODE, @LOCATIONNAME, @LOCATIONSTATUS, @DEPARTMENTCODE, @DEPARTMENTNAME)";

    List<Foo> dataList = GetData();

    if (dataList.Count > 0)
    {
        using (OleDbConnection con = new OleDbConnection(connectionString))
        {
            using (OleDbCommand cmd = new OleDbCommand(insertStatment, con))
            {
                con.Open();
                foreach (var items in dataList)
                {

                    cmd.Parameters.AddRange(new OleDbParameter[]
                    {
                        new OleDbParameter("@PLANTCODE", items.PLANTCODE),
                        new OleDbParameter("@LOCATIONCODE", items.LOCATIONCODE),
                        new OleDbParameter("@LOCATIONNAME", items.LOCATIONNAME),
                        new OleDbParameter("@LOCATIONSTATUS", items.LOCATIONSTATUS),
                        new OleDbParameter("@DEPARTMENTCODE", items.DEPARTMENTCODE),
                        new OleDbParameter("@DEPARTMENTNAME", items.DEPARTMENTNAME),
                    });

                    cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                }
            }
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM