C# 从表中读取数据,然后插入到表中
这是从表中读取数据然后插入到表中的正确方法吗 我试图读取max number或rec_id来创建seq列+1,以便将我的数据记录插入到同一个表中C# 从表中读取数据,然后插入到表中,c#,oracle,C#,Oracle,这是从表中读取数据然后插入到表中的正确方法吗 我试图读取max number或rec_id来创建seq列+1,以便将我的数据记录插入到同一个表中 //Opening the connection with Oracle Database OracleConnection conn = new OracleConnection(oradb); conn.Open(); //Create the
//Opening the connection with Oracle Database
OracleConnection conn = new OracleConnection(oradb);
conn.Open();
//Create the oracle statment and insert data into oracle database
OracleCommand cmd1 = new OracleCommand();
cmd1.Connection = conn;
cmd1.CommandText = "SELECT NVL (MAX (rec_id), 0) + 1 FROM backup_check";
OracleDataReader dr = cmd1.ExecuteReader();
dr.Read();
label1.Text = dr.GetString(0);
conn.Dispose();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
//OracleTransaction trans = conn.BeginTransaction(); -- add rollback in case of transaction not complate for some reason
cmd.CommandText = "insert into my table(" + "'" + v_rec_id + "'" + ",OFFICE_CODE,DUMP_NAME,DUMP_STATUS,SYSTEM,CHECK_DATE)values(null,null," + "'" + keyword + "'" + ",'0','abc',sysdate)";
cmd.ExecuteNonQuery();
//Closing the connection with oracle databae
conn.Dispose();
首先,您应该忘记使用MAX函数来检索要插入到“所谓的自动增量列”中的下一个值。问题产生于这样一个事实:在一台机器上运行的代码不能阻止另一台机器上的另一个用户与您的代码同时执行相同的代码。这可能会导致两个用户收到相同的MAX结果,从而创建无效的重复密钥 在Oracle中,您应该将表标记为具有主键(REC_ID)的 类似这样的东西(在这里动态书写,现在还没有测试过……) 此时,当您尝试插入新记录时,触发器将启动并计算下一个分配给主键的值。
C#代码简化了很多,变成:
string cmdText = @"insert into myTable
(OFFICE_CODE,DUMP_NAME,DUMP_STATUS,SYSTEM,CHECK_DATE)
values(null,:keyw,'0','abc',sysdate)";
using(OracleConnection conn = new OracleConnection(oradb))
using(OracleCommand cmd = new OracleCommand(cmdText, conn))
{
conn.Open();
//using(OracleTransaction trans = conn.BeginTransaction())
//{
cmd.Parameters.AddWithValue(":keyw",keyword);
cmd.ExecuteNonQuery();
// trans.Commit();
//}
}
之前无需阅读任何内容,命令文本未连接避免SQL注入,关闭和处置是自动从使用块退出的…否,这里有很多问题。MAX无法在多用户环境中可靠地工作,创建sql文本连接字符串是一种非常糟糕的做法,在一次性对象周围缺少using语句会导致资源泄漏。因此,v_rec_id是MAX的结果,而不是用于测试MAX结果的列、、、yea v_rec_id的名称。。。请问您对增强代码的建议是什么,比如我应该做什么来避免创建sql文本连接字符串?。。。对于使用dispose,我认为出于安全原因,我将在完成事务后关闭与数据库的连接。。。非常感谢你的建议,非常感谢你的解释。。。您是否介意告诉我使用oracle命令与使用(OracleConnection conn=new OracleConnection(oradb))有什么区别使用这样的“使用”有什么好处?简言之,如果一次性对象是在using语句中创建的,那么即使using块内触发异常,也不需要调用Dispose。使用类似于try/finally,其中finally部分始终包含对在Using块开头创建的对象的Dispose调用。最后一个问题Steve,我正计划使用(OracleTransaction trans=conn.BeginTransaction())来处理可能发生的任何异常,并在catch部分回滚整个事务。。。你的观点很值得赞赏,但没有得到甲骨文的证实,但应该是一样的:另一方面,
string cmdText = @"insert into myTable
(OFFICE_CODE,DUMP_NAME,DUMP_STATUS,SYSTEM,CHECK_DATE)
values(null,:keyw,'0','abc',sysdate)";
using(OracleConnection conn = new OracleConnection(oradb))
using(OracleCommand cmd = new OracleCommand(cmdText, conn))
{
conn.Open();
//using(OracleTransaction trans = conn.BeginTransaction())
//{
cmd.Parameters.AddWithValue(":keyw",keyword);
cmd.ExecuteNonQuery();
// trans.Commit();
//}
}