在我的订单表中,我对发票中的每个订单项都有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); }
}
答案 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
)将始终按原始顺序返回记录,因此如果您在启动时知道排序顺序,则无需在每次操作时一次又一次地指定它。但是,如果您选择不同的组或加入,或者将集合从一个函数传递到另一个函数以使订单可能不确定,那么您可能需要再次对它们进行排序如果排序顺序很重要。