保持序列相同的项目列表

时间:2016-04-29 12:39:33

标签: c# oracle11g

在我的订单表中,我对发票中的每个订单项都有PK INVOICE ID 和一个FK CUSTOMER ID我想保持下面代码中同一项目的CUSTOMER ID序列相同,但是我只是想知道我是用正确的方式做的还是有更好的方法这样做

string connstr = "Data Source=JDT; User Id=admin; password=admin;";

string seqcmdtxt = @"SELECT CUSTOMER_ID_SEQ.NEXTVAL AS CUSTSEQ FROM DUAL";

string insertcmdtxt = @"INSERT INTO ORDERS (ORDER_ID,
                                            CUSTOMER_ID,
                                            PRODUCT_ID,
                                            QUANTITY,
                                            UNIT_PRICE,
                                            ORDER_STATUS,
                                            NOTES,
                                            CREATED_BY,
                                            CREATED_ON,
                                            UPDATE_BY,
                                            UPDATE_ON)
                                            VALUES
                                            (ORDER_ID_SEQ.NEXTVAL,      --ORDER_ID
                                            :TB_INVOICE_ID,    --CUSTOMER_ID
                                            :DGV_PRODUCT_DESC,          --PRODUCT_ID
                                            :DGV_QUANTITY,              --QUANTITY
                                            :DGV_UNIT_PRICE,            --UNIT_PRICE
                                            NULL,                       --ORDER_STATUS
                                            :DGV_NOTES,                 --NOTES
                                            'SYSTEM',                   --CREATED_BY
                                            SYSDATE,                    --CREATED_ON
                                            NULL,                       --UPDATE_BY
                                            NULL)                       --UPDATE_ON
                        RETURNING ORDER_ID INTO :OUT_ORDER_ID";   //~ Returning VAULES ~//

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

        cmd.CommandText = seqcmdtxt;

        OracleDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            TB_INVOICE_ID.Text = reader["CUSTSEQ"].ToString();
        }
        cmd.CommandText = insertcmdtxt;



        for (int i = 0; i < DGV_INVOICE.Rows.Count; i++)
        {
            //~ refreshing parameters ~//
            cmd.Parameters.Clear();

            cmd.Parameters.Add(new OracleParameter("TB_INVOICE_ID", TB_INVOICE_ID.Text));
            cmd.Parameters.Add(new OracleParameter("DGV_PRODUCT_DESC", DGV_INVOICE.Rows[i].Cells[1].Value));
            cmd.Parameters.Add(new OracleParameter("DGV_QUANTITY", DGV_INVOICE.Rows[i].Cells[2].Value));
            cmd.Parameters.Add(new OracleParameter("DGV_UNIT_PRICE", DGV_INVOICE.Rows[i].Cells[3].Value));
            cmd.Parameters.Add(new OracleParameter("DGV_NOTES", DGV_INVOICE.Rows[i].Cells[5].Value));

            cmd.Parameters.Add(":OUT_ORDER_ID", OracleDbType.Decimal, ParameterDirection.Output);
            //cmd.Parameters.Add(":OUT_CUSTOMER_ID", OracleDbType.Decimal, ParameterDirection.Output);

            cmd.ExecuteNonQuery();
        }

        TB_INVOICE_ID.Text = (cmd.Parameters[":OUT_ORDER_ID"].Value).ToString();
        //TB_NOTES.Text = (cmd.Parameters[":OUT_CUSTOMER_ID"].Value).ToString();
    }
    catch (Exception EX)
    { MessageBox.Show(EX.Message, "error msg", MessageBoxButtons.OK, MessageBoxIcon.Error); }
}

2 个答案:

答案 0 :(得分:0)

一些指示。

  • 考虑将获取客户ID的代码与添加发票行的代码分开

    int GetCustomerId();

    void AddInvoice(int customerId);

  • 您似乎将CUSTSEQ存储在全局变量(输入框)中。我会考虑将其存储在局部变量

    string customerSequenceId = reader [&#34; CUSTSEQ&#34;]。ToString(); cmd.Parameters.Add(new OracleParameter(&#34; TB_INVOICE_ID&#34;,customerSequenceId));

答案 1 :(得分:0)

通常,您不必过于关注数据库中记录的存储顺序。 (它在性能方面有所不同,但从应用程序的角度来看并不重要。)重要的是记录在检索时的排序顺序。这可能会有所不同。在一种情况下,您可能希望按日期排序,按数量排序,等等。

首先,最重要的是SQL查询中的'ORDER BY'子句。即使数据库可能看起来以某种可预测的顺序返回记录,但始终指定顺序非常重要,除非它绝对无关紧要。

然后,如果您在应用程序中根据该查询的结果构建类似List<Order>的集合,那么您还需要确保如果序列很重要,您还需要指定.OrderBy或{{1}在您的LINQ表达式中。许多操作(如.OrderByDescending)将始终按原始顺序返回记录,因此如果您在启动时知道排序顺序,则无需在每次操作时一次又一次地指定它。但是,如果您选择不同的组或加入,或者将集合从一个函数传递到另一个函数以使订单可能不确定,那么您可能需要再次对它们进行排序如果排序顺序很重要。