C# 什么时候字符串不是字符串
来自“数据库引擎中发生碰撞的事情”部门: 此函数返回看似有效的值,但未发布记录(无错误消息): …似乎有效(返回一个值,并且插入(似乎)没有发出嘎嘎声)。。。然而,数据库中没有插入任何记录 这个笨拙的(sp?)功能,OTOH:C# 什么时候字符串不是字符串,c#,oracle,sequence,C#,Oracle,Sequence,来自“数据库引擎中发生碰撞的事情”部门: 此函数返回看似有效的值,但未发布记录(无错误消息): …似乎有效(返回一个值,并且插入(似乎)没有发出嘎嘎声)。。。然而,数据库中没有插入任何记录 这个笨拙的(sp?)功能,OTOH: private String GetSomeTableIDSequenceVal_Fake() { int iYear = DateTime.Now.Year; int iMonth = DateTime.Now.Month; int iDay =
private String GetSomeTableIDSequenceVal_Fake()
{
int iYear = DateTime.Now.Year;
int iMonth = DateTime.Now.Month;
int iDay = DateTime.Now.Day;
int iHour = DateTime.Now.Hour;
int iSecond = DateTime.Now.Second;
String sYear = iYear.ToString();
String sMonth = iMonth.ToString();
String sDay = iDay.ToString();
String sHour = iHour.ToString();
String sSecond = iSecond.ToString();
if (iMonth < 10)
{
sMonth = String.Format("0{0}", sMonth);
}
if (iDay < 10)
{
sDay = String.Format("0{0}", sDay);
}
if (iHour < 10)
{
sHour = String.Format("0{0}", sHour);
}
if (iSecond < 10)
{
sSecond = String.Format("0{0}", sSecond);
}
return String.Format("{0}{1}{2}-{3}{4}", sYear, sMonth, sDay, sHour, sSecond);
}
更新:
我添加了Xaction支持,但似乎没有任何区别:
我将其包装在一笔交易中,这没有什么区别:
OracleTransaction ot;
. . .
try
{
ot = con.BeginTransaction();
cmd.Transaction = ot;
cmd.ExecuteNonQuery();
ot.Commit();
}
catch (Exception ex)
{
ot.Rollback();
}
更新redux:
卢克对同时使用两个连接提出了很好的观点;因此,我将代码更改为:
private String GetInterpreterTicketIDSequenceVal()
{
String query = "SELECT TO_CHAR(SYSDATE,'YYYYMMDD-') || LTRIM(TO_CHAR(ABC.SOMETABLEID.NEXTVAL, '000000')) FROM DUAL";
OracleCommand oc = new OracleCommand(query, con);
oc.CommandType = CommandType.Text;
String s = oc.ExecuteScalar().ToString();
try
{
return s;
}
catch (OracleException ex)
{
MessageBox.Show(ex.Message);
return string.Empty;
}
}
…但在穆德维尔还是没有乐趣
重新访问更新redux:
我让它工作了;谢谢大家的帮助和洞察力 事实上,它已经工作了一段时间了——问题是我在蟾蜍中愚蠢的查询——我忘记了我在新记录中添加的值与我正在查询的值略有不同……因此看起来这些记录没有被添加,但它们确实是。
tgif 设置参数的方式似乎很奇怪,因为您的参数对象最终没有名称-请尝试更改类似于以下内容的代码:
OracleParameter p_TICKETID = new OracleParameter("p_TICKETID", OracleDbType.NVarchar2, ParameterDirection.Input);
p_TICKETID.Size = 20;
我试着运行上面的代码,但只有当
translatorticketid
序列超过999999时,我才能够重现它的问题。如果你有问题,那么一定有什么是你没有告诉我们的。例如,您的表如何定义?有什么限制?序列是如何定义的?桌子上有触发器吗
您的getExpressorTicketDiscoveryVal()
方法是否需要使用自己与数据库的连接?它是否可以使用与代码其余部分相同的连接
如果序列解释器ticketid
已超过999999,则TO_CHAR
调用将返回一个哈希字符串:
SQL> select ltrim(to_char(999999, '000000')) from dual;
LTRIM(T
-------
999999
SQL> select ltrim(to_char(1000000, '000000')) from dual;
LTRIM(T
-------
#######
您是否尝试在SQLPLUS控制台中运行SELECT命令?返回哪个字符串?您是否设置了断点来查看它返回的内容?因为伪方法应该可以实现这一点,我猜发布的代码只是缺少将p_TICKETID参数添加到参数集合的代码。但这可能与此有关。是的,我查看了返回值。这个拙劣的伪值类似于20120316-1557。另一个类似,但不完全相同:比如20120316-49109。表中VarChar的大小是20,所以它不是太大;在那个列上没有约束,所以。。。?通过它,它确实很好地命中了ExecuteOnQuery(不会退出到回滚中)…@Corin:调用这两个方法的代码中唯一不同的地方(真正的一个不起作用,“假”的一个不起作用)是它对一个或另一个方法的调用(都包含在上面)。我将代码更改为这种样式,没有变化;我认为我不需要显式命名参数的原因是,只要它们以在查询语句中出现的相同顺序添加,它们就可以工作;谢谢大家的帮助和洞察力。事实上,它已经工作了一段时间了——问题是我在Toad中的愚蠢查询——我忘记了我在新记录中添加的值与我正在搜索的值略有不同……所以看起来好像没有添加记录,但它们确实是;假设你指的是口译员。表上唯一的约束实际上是该列的约束,但它看起来无害:Type=Primary Key;状态=已启用;可延期=不可延期;延迟=立即;Validated=Validated有一个触发器,看起来它会自动为该列生成值。这实际上是我预期会发生的,我尝试添加记录的第一个错误是没有添加(PK)列。。。因此,我显式地添加了值。显然,你必须对Oracle序列这样做。@ClayShannon:对不起,表名弄错了,我现在已经解决了。可以使用触发器自动生成列值;我已经编辑了我的答案,添加了关于如何做的详细信息。我现在不在工作,因此无法访问Toad/数据库,但如果触发器自动添加val(有道理,他们会这样设计),为什么它可以与我的“fake”功能配合使用?den Mark中有些东西坏了。@ClayShannon:也许触发器不会自动为列生成值?也许它是残疾的?如果没有看到触发器的代码,我就不能说了。
OracleParameter p_TICKETID = new OracleParameter("p_TICKETID", OracleDbType.NVarchar2, ParameterDirection.Input);
p_TICKETID.Size = 20;
SQL> select ltrim(to_char(999999, '000000')) from dual;
LTRIM(T
-------
999999
SQL> select ltrim(to_char(1000000, '000000')) from dual;
LTRIM(T
-------
#######