【问题标题】:SqlCommand.ExecuteNonQuery() not throwing expected error in VB.netSqlCommand.ExecuteNonQuery() 未在 VB.net 中引发预期错误
【发布时间】:2017-06-01 09:44:04
【问题描述】:
Me.mycom.CommandText = "INSERT INTO Schritte_WegGruppen VALUES (" & SchrittID.ToString & ", " & WegGruppeID.ToString & ", '...')"
Me.mycom.ExecuteNonQuery()

上述两行代码在 VB .NET 中执行得非常好,但在 C# 中却抛出了这个异常:

声明已经结束。违反主键限制“PK_Schritte_WegGruppen_ID_Schritte_ID_WegGruppen”。不能将重复的键插入到对象“dbo.steps_pathgroups”中。双键值为 (1, 1)。

这个异常是完全合乎逻辑的,当我在 SQL Server Management Studio 中执行这个查询时也遇到了同样的异常。当我运行它时,我预计 VB 代码中会出现错误,但我没有得到任何异常。我不理解为什么。

ExecuteNonQuery() 在 VB.Net 和 C# 中的工作方式有区别吗?

这是我试图翻译成 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

翻译后的C#代码在这里:

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;
}

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

【问题讨论】:

  • 您确定您的 VB.net 代码中没有try/catch 结构吗?
  • 跟我说吧……“do”、“not”、“concatenate”、“input”、“into”、“sql”.... 说真的,那个代码是一个 巨大的 SQLI风险。但是:在 VB 代码中,有没有可以吞下异常的错误处理代码?
  • 你没有向我们展示 c# 代码
  • C# 和 VB.NET 中的异常处理方式相同。如果不是这样,那将是可怕的。如果确实没有抛出异常,您是否使用调试器检查过?是否有一些try-catch 或旧的On Error GoTo Fehler
  • 您在 VB.Net 和 C# 之间插入不同的值。如果你使用 MySQL,你可以使用“REPLACE INTO”而不是“INSERT INTO”。或者,作为一种解决方法,在插入新行之前使用主键删除。

标签: c# .net sql-server vb.net


【解决方案1】:

ADO.NET - 或者更普遍的 any 库代码 - 几乎总是不知道或关心调用代码使用什么语言。因此,您所描述的可能有以下三个原因:

  • 您的两个测试用例中的数据/系统状态不同,这意味着它在一种情况下确实没有出错,但在另一种情况下却存在 - 因为它们正在谈论不同的场景
  • 这是错误的,但是您有一些周围的异常处理代码(通常:try/catchOn Error)正在吞噬异常
  • 您在两种语言之间翻译代码时出错,您正在执行的实际字符串是不同的

【讨论】:

  • 我使用的是完全相同的数据库和相同的表。在 SQL 查询调用之前检查最终值,它们是相同的。事实上,困扰我的是,当我直接在 SQL Server 管理工作室上运行并传入 VB 代码时,VB 代码中框架的 SQL 查询字符串会失败。这对我来说很奇怪。
  • @user2139876 然后再一次:检查它周围的错误处理代码。如果您只是在ExecuteNonQuery() 之后添加Console.WriteLine("yay, I got here!");(或类似名称) - 它真的到达那里吗?
  • 刚刚检查过。不,它没有。在ExecuteNonQuery() 处抛出异常
  • @user2139876 所以......它实际上在两种情况下都会抛出?那么问题是你的异常处理代码
  • 不,我只在 C# 代码中遇到异常。 VB 代码无异常运行,这是我不理解的行为。
【解决方案2】:

将 ex 捕获为异常

请将 Catch ex As Exception 替换为 Catch ex As SqlException,我遇到了同样的问题,现在我可以捕获异常了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    相关资源
    最近更新 更多