C# 从SqlDataReader检索INSERT语句的基础异常

C# 从SqlDataReader检索INSERT语句的基础异常,c#,.net,sql-server,ado.net,C#,.net,Sql Server,Ado.net,我正在执行一个SQL insert语句,例如 INSERT INTO Table (fk1, value1) OUTPUT inserted.pk VALUES ('fkv1', 'v1'); 其中“pk”是一个自动递增的键值,如下所示: SqlDataReader reader = cmd.ExecuteReader(); 外键与父表冲突,reader.HasRows()反映了这一点,但是如何检索与错误描述一起抛出的实际异常对象?如果删除“OUTPUT”语句,它将抛出异常,但如果该语句在其

我正在执行一个SQL insert语句,例如

INSERT INTO Table (fk1, value1) OUTPUT inserted.pk VALUES ('fkv1', 'v1');
其中“pk”是一个自动递增的键值,如下所示:

SqlDataReader reader = cmd.ExecuteReader();
外键与父表冲突,reader.HasRows()反映了这一点,但是如何检索与错误描述一起抛出的实际异常对象?如果删除“OUTPUT”语句,它将抛出异常,但如果该语句在其中,它将接受错误,并仅返回“HasRows”==false

我可以在“Results View”属性下使用调试器看到错误,但如何在代码中获取此值

Sql Server 2008r2 .NET4.0

谢谢你的帮助

编辑:


此调用不会引发异常。它尚未成功完成的唯一迹象是“HasRows”为false

我有一段sql,它正在生成一个异常,但是try-catch却没有捕捉到它——这太奇怪了

try
{
   SqlDataReader reader = cmd.ExecuteReader();
}
catch(Exception ex)
{
   string errorMessage = String.Format(CultureInfo.CurrentCulture, 
                         "Exception Type: {0}, Message: {1}{2}", 
                         ex.GetType(),
                         ex.Message,
                         ex.InnerException == null ? String.Empty : 
                         String.Format(CultureInfo.CurrentCulture,
                                      " InnerException Type: {0}, Message: {1}",
                                      ex.InnerException.GetType(),
                                      ex.InnerException.Message));

  System.Diagnostics.Debug.WriteLine(errorMessage);
}
这是密码

try
{
    // Run the SQL statement, and then get the returned rows to the DataReader.

    SqlDataReader MyDataReader = MyCommand.ExecuteReader();

    //note AT THIS POINT there is an exception in MyDataReader
    //if I view MyDataReader in Watch I see this in base->ResultsView->base
    //Conversion failed when converting the varchar value 'lwang' to data type int
    //and errors count is 1 but there is no exception catch!!

    int iRow = 0;
    if (MyDataReader.HasRows)
    {
        int iCol = 0;
        while (MyDataReader.Read())
        {

            //dt.Load(MyDataReader);
            List<String> strFields = new List<String>();

            for (int iField = 0; iField < MyDataReader.FieldCount; iField++)
            {
                strReturn = strReturn + MyDataReader[iField] + ",";
                strFields.Add(MyDataReader[iField].ToString());
            }
            DataRows.Add(strFields);
            iRow++;
        }
    }
}
catch (Exception ex)
{
    //no exception is caught in this case!!  This code is never reached!!
    strError = "An error occurred getting the data table: " + MyCommand.CommandText + " " + ex.ToString();
    throw new Exception(strError);
    return (DataRows);
}
finally
{
    Connection.Close();
}
    return (DataRows);
}
试试看
{
//运行SQL语句,然后将返回的行获取给DataReader。
SqlDataReader MyDataReader=MyCommand.ExecuteReader();
//注意,此时MyDataReader中有一个异常
//如果我在Watch中查看MyDataReader,我会在base->ResultsView->base中看到它
//将varchar值“lwang”转换为数据类型int时,转换失败
//错误计数为1,但没有异常捕获!!
int-iRow=0;
if(MyDataReader.HasRows)
{
int-iCol=0;
while(MyDataReader.Read())
{
//dt.Load(MyDataReader);
List strFields=新列表();
对于(int-iField=0;iField
如果有帮助的话,这里是正在执行的sql 正在执行的sql是:

挑选 hec_Recommension.RecID、hec_Recommension.UtilityID、hec_Recommension.CatID、hec_Recommension.Condition、hec_Recommension.Text、hec_Recommension.Active、hec_Recommension.Ordinal、hec_Recommension.StartDate、hec_Recommension.EndDate、hec_Recommension.CreatedByID、,hec_Recommension.ModifyDate,hec_Recommension.ModifyByID 根据hec_建议,hec_实用程序,hec_reccategory,其中 hec_Recommension.utilityid=hec_utility.id和 hec_Recommension.catid=hec_reccategory.catid和 hec_reccategory.utilityid=hec_utility.utilityid和 hec_utility.utilityId='lwang'


您是否尝试过使用try/catch块来包围此代码?请确保
catch(ExceptionType ex)
,以获取异常信息。如果您有问题,请发布…:-)