OleDbCommand与SqlCommand相比未返回结果

本文关键字:返回 结果 SqlCommand OleDbCommand | 更新日期: 2023-09-27 18:29:54

我正试图将程序从SqlConnection更改为OleDbConnection,但遇到了一个小问题。

我的程序使用SqlConnection可以正常工作,但我无法使用OleDb

我的程序读取存储过程(XML)的结果,将其发送到web服务,然后将结果存储在表中。

我在从存储过程中读取XML时遇到问题。

这是我的第一部分代码:

public static bool BuildXml()
{
    using (OleDbCommand buildXml = new OleDbCommand("usp_BUILD_RISKCALC_XML", SqlOleDbConnection))
    {
       buildXml.CommandType = CommandType.StoredProcedure;
       try
       {
           OleDbDataReader reader = buildXml.ExecuteScalar();
           while (reader.Read())
           {
               SendXml = reader.GetString(0);
           }
        }
        catch (Exception ex)
        {
             WriteLog(ex.Message, 101);
                return false;
        }
    }
} 

我得到一个InvalidOperationException,它的文本是

指定的强制转换不是有效的

对于reader.GetString(0)

我100%确信存储过程正在运行,因为我已经使用SqlConnection进行了测试,并在SQLServerManagementStudio中运行。

OleDbCommand与SqlCommand相比未返回结果

您的代码应该是;

public static bool BuildXml()
{
     using (OleDbCommand buildXml = new OleDbCommand("usp_BUILD_RISKCALC_XML", SqlOleDbConnection))
     {
          buildXml.CommandType = CommandType.StoredProcedure;
          try
          {
               object value = buildXml.ExecuteScalar();
               SendXml = Convert.ToString(value);
          }
          catch (Exception ex)
          {
               WriteLog(ex.Message, 101);
               return false;
          }
     }
}

代码buildXml.ExecuteScalar()返回一个对象。因此,将其强制转换为OleDbDataReader将最终在InvalidOperationException中结束。

ExecuteScalar返回类型为object,无法将其转换为OleDbDataReader。使用ExecuteScalar意味着您确信只想从存储过程中返回一个值。您不需要OleDbDataReader,只需尝试以下操作:

SendXml = buildXml.ExecuteScalar().ToString;