首页 文章

如何从SqlDataReader uniqueidentifier获取Guid

提问于
浏览
3

SQL Server 2008(版本10.50.2550) .

我有一个选择查询来返回uniqueidentifier类型的单个列 .

我想把它变成Guid类型的C#变量 .

以下所有方法都会导致异常 .

reader的类型为SqlDataReader .

using (var reader = command.ExecuteReader())
{

    if (reader.Read())
    {       
        Guid guid = reader.GetGuid(reader.GetOrdinal("integ_schemehistoryId")); //1

        Guid guid = Guid.Parse((string)reader["integ_schemehistoryId"]); //2

        Guid guid = (Guid)reader["integ_schemehistoryId"]; //3

        Guid guid = new Guid((string)reader["integ_schemehistoryId"]); //4

        Guid guid = Guid.Parse(reader["integ_schemehistoryId"].ToString()); //5
    }

}

错误1:

System.Data.SqlClient.SqlException (0x80131904): Conversion failed when converting from a character string to uniqueidentifier.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.HasMoreRows()
   at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout)
   at System.Data.SqlClient.SqlDataReader.Read()
   at Simego.DataSync.DynamicColumns.DataSourceRowOverride.get_EpochSchemeHistoryID()

错误2:

System.InvalidCastException: Unable to cast object of type 'System.Guid' to type 'System.String'.
   at Simego.DataSync.DynamicColumns.DataSourceRowOverride.get_EpochSchemeHistoryID()

错误3:

System.Data.SqlClient.SqlException (0x80131904): Conversion failed when converting from a character string to uniqueidentifier.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.HasMoreRows()
   at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout)
   at System.Data.SqlClient.SqlDataReader.Read()
   at Simego.DataSync.DynamicColumns.DataSourceRowOverride.get_EpochSchemeHistoryID()

错误4:

System.InvalidCastException: Unable to cast object of type 'System.Guid' to type 'System.String'.
   at Simego.DataSync.DynamicColumns.DataSourceRowOverride.get_EpochSchemeHistoryID()

5的错误:

System.Data.SqlClient.SqlException (0x80131904): Conversion failed when converting from a character string to uniqueidentifier.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.HasMoreRows()
   at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout)
   at System.Data.SqlClient.SqlDataReader.Read()
   at Simego.DataSync.DynamicColumns.DataSourceRowOverride.get_EpochSchemeHistoryID()

6 回答

  • 1

    您的数据或SQL存在问题 . 第一种和第三种方法应该有效 - 我个人会使用第一种形式,因为它在我看来是最清晰的 .

    但是看看堆栈跟踪:

    ...位于Simego.DataSync.DynamicColumns.DataSourceRowOverride.get_EpochSchemeHistoryID()的System.Data.SqlClient.SqlDataReader.Read()处的System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout)

    请注意,这是 Read() 调用失败,而不是 GetGuid 或索引器 .

    我的猜测是你的属性被多次获取,有时它可以工作 - 这就是你在第二种方法中获得强制转换异常的原因 - 但是对于某些行,它由于数据或SQL的某些问题而失败 . 因为我们帮助你超越诊断,但那是你应该在下一步看的地方 .

  • 1

    你有没有尝试过:

    Guid guid = new Guid((string)reader["integ_schemehistoryId"]);
    
  • 1

    尝试使用 Guid.Parse method

    Guid guid = return Guid.Parse((string)reader["integ_schemehistoryId"]);
    
  • 7

    该错误是从SQL生成的 . 换句话说,SQL命令文本有问题 . 不是你的c#代码 .

  • 0

    正如其他答案所示,你应该尝试:

    Guid guid = Guid.Parse(reader["integ_schemehistoryId"].ToString())
    

    您可能还想检查存储过程和表格,可能存在问题 .

  • 0
    object val = reader[0];
        Guid g;
        if ( Guid.TryParse(val, out g) )
        {
            return g;
        } 
        else 
        {
            Trace.WriteLine("Error: " + g == null ? string.Empty : g.ToString());   
        }
    

相关问题