2016-05-26 111 views
0

我有一个try...catchINSERT一张表。事情是这样的:查看哪一行导致“INSERT语句与FOREIGN KEY冲突”?

try 
{ 
    sqlCommand.ExecuteNonQuery(conn, CommandType.Text, insertSql); 
} 
catch (Exception ex) 
{ 
    throw ex; 
} 

在我插入多行之一,有一个失败,错误INSERT语句冲突与外键。

这很好,但可以返回更多信息吗?Exception?也许它可以返回插入失败的值?

据我所知,这可以做很多方法;我只想知道是否可以在不改变结构或stored procedure调用(即添加OUTPUT参数)和try...catch的情况下获得有关违规行的一些信息。

再次感谢。

回答

0
try 
{ 
    sqlCommand.ExecuteNonQuery(conn, CommandType.Text, insertSql); 
} 
catch (Exception ex) 
{ 
    throw new Exception(insertSql + Environment.NewLine + ex.ToString()); 
} 
+0

这真的是最实用的解决方案。谢谢。 – rbhat

0

请尝试以下操作。

BEGIN TRY 
     BEGIN 
     --Do your update here 
      SELECT @@ROWCOUNT 
      END 
    END TRY 
     BEGIN CATCH 
      BEGIN 
        DECLARE @ErrorMessage NVARCHAR(4000); 
        DECLARE @ErrorSeverity INT; 
        DECLARE @ErrorState INT; 

        SELECT 
         @ErrorMessage = ERROR_MESSAGE(), 
         @ErrorSeverity = ERROR_SEVERITY(), 
         @ErrorState = ERROR_STATE(); 

        RAISERROR (@ErrorMessage, -- Message text. 
           @ErrorSeverity, -- Severity. 
           @ErrorState -- State. 
           ); 
      END 
      END CATCH; 
0

尝试 - 抓住是好的,但还不够。你需要找到冒犯行。

begin try 
insert... 
select... 
end try 
begin catch 
declare @badFK nvarchar(max) 
select @badFK = (select fk_field from fk_table f 
left join pk_table p on p.pk_field = f.fk_field 
where p.pk_field is null 
for xml auto,elements,root) 
--raiserror as @vasmi recommend but include @badFK into message 
end catch 
0

你没看到任何关于C#,但我想,你使用它。

在C#中,你可以使用这个:

try 
{ 
// bla bla bla 
} 
catch (SqlException ex) 
{ 
MessageBox.Show(es.ToString()); 
} 

此错误将继续什么样的错误的是(也许一个主键复制,等等,等等)

+0

在这种情况下,'SqlException'将返回与'Exception'相同的错误,所以这不起作用。 – rbhat

相关问题