7

SQL Server 2008(版本 10.50.2550)。

我有一个选择查询来返回唯一标识符类型的单列。

我想把它变成一个 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()
4

7 回答 7

8

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

但是看看堆栈跟踪:

...在 System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout) 在 System.Data.SqlClient.SqlDataReader.Read() 在 Simego.DataSync.DynamicColumns.DataSourceRowOverride.get_EpochSchemeHistoryID()

请注意,Read()失败的是调用,而不是 GetGuid索引器。

我的猜测是您的属性被多次获取,有时它可以工作 - 这就是为什么您在第二种方法中遇到强制转换异常 - 但对于某些行,由于数据或 SQL 的一些问题而失败。由于我们不知道您的数据来自哪里,因此我们无法帮助您超越诊断,但这就是您接下来应该关注的地方。

于 2013-07-19T16:04:00.047 回答
3

正如其他答案所建议的那样,您应该尝试:

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

您可能还想检查您的存储过程和表,那里可能有问题。

于 2013-07-19T15:41:39.913 回答
2

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

于 2013-07-19T15:43:50.677 回答
0

使用Guid.Parse 方法试试

Guid guid = return Guid.Parse((string)reader["integ_schemehistoryId"]);
于 2013-07-19T15:15:42.253 回答
0

你有没有尝试过:

Guid guid = new Guid((string)reader["integ_schemehistoryId"]);
于 2013-07-19T15:14:27.533 回答
0

在 Oracle 数据库中:

"ID" RAW(16) DEFAULT SYS_GUID() NOT NULL ENABLE, 

这段代码对我有用:

using (IDataReader dr = ... )
    {
        while (dr.Read())
        {
            var Id = new Guid();
            if (!(dr["ID"] is DBNull)){
                Id = new Guid((byte[])dr.GetValue(dr.GetOrdinal("ID")));
            }                   
        }
        dr.Close();
    } 
于 2021-02-15T12:22:47.783 回答
-1
    object val = reader[0];
    Guid g;
    if ( Guid.TryParse(val, out g) )
    {
        return g;
    } 
    else 
    {
        Trace.WriteLine("Error: " + g == null ? string.Empty : g.ToString());   
    }
于 2013-07-19T16:09:34.690 回答