Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么时候字符串不是字符串_C#_Oracle_Sequence - Fatal编程技术网

C# 什么时候字符串不是字符串

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 =

来自“数据库引擎中发生碰撞的事情”部门:

此函数返回看似有效的值,但未发布记录(无错误消息):

…似乎有效(返回一个值,并且插入(似乎)没有发出嘎嘎声)。。。然而,数据库中没有插入任何记录

这个笨拙的(sp?)功能,OTOH:

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 ------- #######