我使用System.Data.Common.DbCommand将新行插入数据库.关键是,这一行已经存在.
try
{
[...]
DbCommand insertCommand = [...]
insertCommand.ExecuteScalar();
[...]
}
catch (System.Exception exception)
{
[...]
throw;
}
Run Code Online (Sandbox Code Playgroud)
如果我将显式捕获System.Data.SqlClient.SqlException,我可以像下面一样评估ErrorNumber.
try
{
//insertion code
}
catch(SqlException ex)
{
if(ex.Number == 2627)
{
//Violation of primary key. Handle Exception
}
}
Run Code Online (Sandbox Code Playgroud)
SqlException上下文中的ErrorNumber 2627意味着违反唯一键.请参阅https://msdn.microsoft.com/en-us/library/ms151757%28v=sql.110%29.aspx
到现在为止还挺好.因为我正在使用DbCommand,因此使用不同类型的关系数据库管理系统,我正在寻找一种更通用的方式来捕获这种违反唯一键约束的行为.
感谢帮助.
我有以下VBScript脚本,它创建一个Microsoft COM对象.
set foo = CreateObject("Bar.ProgId")
foo.Einfügen()
Run Code Online (Sandbox Code Playgroud)
该COM对象的实现位于动态链接库中Foo.dll,该库使用Microsoft Foundation Framework(MFC),尤其是Dispatch Maps的机制.
Dispatch Maps显示如下
BEGIN_DISPATCH_MAP(Foo, CCmdTarget)
[...]
DISP_FUNCTION(Foo, "Einfügen", Insert, VT_I2, VTS_NONE)
[...]
END_DISPATCH_MAP()
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.当我在VBA环境中创建这样的COM对象时,例如在Excel应用程序中,调用foo.Einfügen成功.除了在VBScript-Script中.
我认识到OLE自动化应用于VBA以及VBScript.但是当我运行VBScript-Script时,我收到了错误
错误:未知字符; 代码8000A0408;
来源:在Microsoft VBScript中编译失败
首先我认为VBScript-Script中的编码因为字符ü而错误,但我确认它是ANSI编码的.我还验证了我系统上的Windows代码页是Windows-1252西方拉丁字符集.
如果我在Dispatch Map中更改Einfügen为EinfuegenI断言VBScript-Script正在运行.
所以我的问题是,为什么foo.EinfügenVBScript 中的调用行为与VBA不同?这种行为的原因是什么?
对我来说,解决方法是我DISP_FUNCTION在调度图中附加第二个条目,该条目将分派Einfuegen给该函数Insert.在VBScript-Script中,我foo.Einfuegen仍然在VBA中调用foo.Einfügen.