C# SqlCommand.ExecuteOnQuery()未在VB.net中引发预期错误

C# SqlCommand.ExecuteOnQuery()未在VB.net中引发预期错误,c#,.net,sql-server,vb.net,C#,.net,Sql Server,Vb.net,上述两行在VB.NET中执行得非常好,但在C#中会引发此异常: 声明已经结束。违反主键限制“PK_Schritte_WegGruppen_ID_Schritte_ID_WegGruppen”。无法将重复密钥插入到对象“dbo.steps\u pathgroups”中。双键值为(1,1) 此异常完全符合逻辑,我在SQLServerManagementStudio中执行此查询时也会遇到相同的异常。当我运行VB代码时,我希望它会出错,但我没有得到任何异常。我不明白为什么 在VB.Net和C#中,Exe

上述两行在VB.NET中执行得非常好,但在C#中会引发此异常:

声明已经结束。违反主键限制“PK_Schritte_WegGruppen_ID_Schritte_ID_WegGruppen”。无法将重复密钥插入到对象“dbo.steps\u pathgroups”中。双键值为(1,1)

此异常完全符合逻辑,我在SQLServerManagementStudio中执行此查询时也会遇到相同的异常。当我运行VB代码时,我希望它会出错,但我没有得到任何异常。我不明白为什么

在VB.Net和C#中,
ExecuteNonQuery()
的工作方式是否有区别

下面是我试图翻译成C#的完整VB代码

翻译后的C#代码如下:

 Try
        '*** In die Modul Datenbank wechseln ***
        Me.mycom.CommandText = "USE " & ModulDB
        Me.mycom.ExecuteNonQuery()

        Me.mycom.CommandText = "INSERT INTO Schritte_WegGruppen VALUES (" & SchrittID.ToString & ", " & WegGruppeID & ", '...')"
        Me.mycom.ExecuteNonQuery()

        Return 1
    Catch ex As Exception
        Me.ErrMess = ex.Message
        Return -1

我希望我的问题现在更清楚了

ADO.NET—或者更一般的任何库代码—几乎总是不知道或不关心调用代码使用的语言。因此,您所描述的原因可能有三个:

  • 在您的两个测试用例中,数据/系统状态是不同的,这意味着它在一个用例中确实没有错误,但在另一个用例中是错误的,因为它们讨论的是不同的场景
  • 这是一个错误,但是您有一些周围的异常处理代码(通常是:
    try
    /
    catch
    On Error
    )正在吞噬异常
  • 在两种语言之间翻译代码时出错,实际执行的字符串不同
捕获例外
请用Catch-ex-As-SqlException替换Catch-ex-As-Exception,我有同样的问题,现在我可以捕获异常。

你确定你的VB.net代码中没有
try/Catch
结构吗?跟我说吧。。。“do”、“not”、“concatenate”、“input”、“into”、“sql”。。。。说真的,这段代码是一个巨大的SQLI风险。但是:在VB代码中,您是否有任何错误处理代码可能会吞噬异常?您没有向我们展示c代码c和VB.NET中的异常处理是相同的。如果不是这样,那就太可怕了。是否使用调试器检查是否确实没有引发异常?是否有一些
try
-
catch
在任何地方,或者在错误转到Fehler时有好的旧
?您在VB.Net和C#之间插入了不同的值。如果使用MySQL,可以使用“替换到”而不是“插入到”。或者,作为一种解决方法,在插入新行之前使用主键删除。我使用的是完全相同的数据库和表。在SQL查询调用之前检查最终值,并且它们是相同的。事实上,困扰我的是,当我直接在SQLServerManagementStudio上运行并传入VB代码时,VB代码中构建的SQL查询字符串失败。这对我来说很奇怪。@user2139876然后再次:检查它周围的错误处理代码。如果您只需添加
Console.WriteLine(“耶,我来了!”)(或类似)在
ExecuteNonQuery()之后-它真的到达那里了吗?只是选中了。不,没有。异常被抛出到
ExecuteNonQuery()
@user2139876,因此。。。在这两种情况下都是投掷?那么问题是你的异常处理代码不,我只在C代码中得到一个异常。VB代码运行时没有异常,这是我不理解的行为。
 Try
        '*** In die Modul Datenbank wechseln ***
        Me.mycom.CommandText = "USE " & ModulDB
        Me.mycom.ExecuteNonQuery()

        Me.mycom.CommandText = "INSERT INTO Schritte_WegGruppen VALUES (" & SchrittID.ToString & ", " & WegGruppeID & ", '...')"
        Me.mycom.ExecuteNonQuery()

        Return 1
    Catch ex As Exception
        Me.ErrMess = ex.Message
        Return -1
try 
{
    //*** In die Modul Datenbank wechseln ***
    this.mycom.CommandText = "USE " + ModulDB;
    this.mycom.ExecuteNonQuery();

    this.mycom.CommandText = "INSERT INTO Schritte_WegGruppen VALUES (" + SchrittID.ToString() + ", " + WegGruppeID.ToString() + ", '...')";
    this.mycom.ExecuteNonQuery();

    return 1;
}
catch (Exception ex)
{
    this.ErrMess = ex.Message;
    return -1;
}