【发布时间】: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