2013-07-19 38 views
2

SQL Server 2008(版本10.50.2550)。如何從SqlDataReader獲得Guid uniqueidentifier

我有一個select查詢來返回uniqueidentifier類型的單個列。

我想把它變成一個類型爲Guid的C#變量。

以下所有方法都會導致異常。

閱讀器是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() 
+0

你會得到什麼錯誤? – SLaks

+2

'GetGuid'應該可以工作。我會建議*反對任何不必要地執行兩個字符串轉換的方法。請提供調用'GetGuid'時出現的錯誤的詳細信息。 –

+0

@JonSkeet哪一個呢? – cja

回答

6

您的數據或SQL有問題。第一種和第三種方法應該可行 - 我個人會使用第一種方式,因爲它在我看來是最清楚的。

但看看堆棧跟蹤:

... 在System.Data.SqlClient.SqlDataReader.ReadInternal(布爾的setTimeout) 在System.Data.SqlClient.SqlDataReader.Read() 在Simego。 DataSync.DynamicColumns.DataSourceRowOverride.get_EpochSchemeHistoryID()

注意,它是Read()呼叫時失敗,GetGuid或索引。

我的猜測是,你的財產被獲取數次,有時它的作品 - 這就是爲什麼你讓你的第二個方法鑄造的例外 - 但一些行,它由於某種問題與數據或SQL。由於我們不知道您的數據來自哪裏,因此我們無法幫助您超出診斷範圍,但這是您應該繼續觀察的地方。

+0

+1的努力... – cja

+0

左連接抓取重複鍵?這將做到這一點。 – Triynko

1

你試過:

Guid guid = new Guid((string)reader["integ_schemehistoryId"]); 
+0

是的,看到問題。 (也許你在我編輯問題之前發佈了這個) – cja

+1

我認爲你沒有。 '新的Guid(...)使用構造函數,你的問題表明你已經嘗試過靜態方法'Guid.Parse','SQLDataReader'方法'.GetGuid',並直接從對象轉換爲'(Guid)'在'Reader'中,這三種情況都沒有使用'new',這是構造函數。 – welegan

+0

對不起,你說的對。我得到:System.InvalidCastException:無法強制類型爲'System.Guid'的對象輸入'System .String'。 at Simego.DataSync。DynamicColumns.DataSourceRowOverride.get_EpochSchemeHistoryID() – cja

1

嘗試使用Guid.Parsemethod

Guid guid = return Guid.Parse((string)reader["integ_schemehistoryId"]); 
+0

見我的問題的第二次嘗試。 – cja

+3

@cja:你正在傳遞錯誤的數據類型 - 這是可能的,如果叫這會工作*正確*,雖然它沒有這樣做的最佳方式。 –

+0

@cja讀者值轉換爲字符串,因爲Parse方法期望的字符串作爲PARAM –

0

至於其他的答案建議,你應該嘗試:

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

你可能還想檢查你的存儲過程和你的表,那裏可能有問題。

+0

運行時錯誤:http://pastebin.com/H7BhUXzk – cja

1

從SQL生成該錯誤。換句話說,你的SQL命令文本有問題。不是你的C#代碼。

+0

它絕對不會越過「如果(reader.Read())」 – cja

+2

@cja:不,它不需要 - 至少不每時每刻。看看堆棧跟蹤... –

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()); 
    } 
+0

第三行編譯錯誤:http://pastebin.com/mK6ZvXiX – cja

相關問題