C# 将ListView所选项目标记强制转换为guid

C# 将ListView所选项目标记强制转换为guid,c#,sql,sql-server,C#,Sql,Sql Server,我有一个包含SQL数据库数据的ListView,我使用ListView项中的标记值将数据库中的uniqueid存储在中(因此我不必在ListView中创建额外的隐藏列来存储它) 我得到以下错误: 发生System.InvalidCastException异常 这是我的代码: using (SqlCommand sqlCommand = new SqlCommand("SELECT * FROM Employees WHERE ID = @ID", DBFactory.GetSqlConn

我有一个包含SQL数据库数据的
ListView
,我使用
ListView
项中的标记值将数据库中的
uniqueid
存储在中(因此我不必在
ListView
中创建额外的隐藏列来存储它)

我得到以下错误:

发生System.InvalidCastException异常

这是我的代码:

using (SqlCommand sqlCommand = new SqlCommand("SELECT * FROM Employees WHERE ID = @ID",     DBFactory.GetSqlConnection()))
{
    sqlCommand.Parameters.Add("@ID", SqlDbType.UniqueIdentifier).Value = ((Guid)listView1.SelectedItems[0].Tag);

    using (SqlDataAdapter sda = new SqlDataAdapter(sqlCommand))
    {
        sda.Fill(table);
    }
}
有什么想法/建议吗

编辑: 我发现listView1.SelectedItems.SelectedItemArray[0].Tag对象{string}的类型为。
非常奇怪,因为列“ID”=uniquedentifier的数据类型..

您可能必须将其解析为GUID,而不是强制转换它

sqlCommand.Parameters.Add("@ID", SqlDbType.UniqueIdentifier).Value =
    (new Guid(listView1.SelectedItems[0].Tag));

a显然,
listView1.SelectedItems[0]。标记
始终是一个字符串,无论您在其中存储了什么


通过将
SqlDbType.UniqueIdentifier
更改为
SqlDbType.VarChar

来解决这个问题,如果调用
listView1.SelectedItems[0]。Tag.GetType().ToString()
结果是什么?调用
listView1.SelectedItems[0].Tag.ToString()
怎么样。这将有助于了解如何将此值强制转换/解析为GUID。listView1的类型是什么。SelectedItems[0]。标记?请尝试单步执行调试器,查看listView1.SelectedItems[0]的对象类型。标记是什么。您可能需要将该值解析为GUID,而不是强制转换它。listView1.SelectedItems[0]的值。如果我尝试获取类型,则标记=0197df7d-7a64-4e29-946d-c055bfca8e1b我尝试存储该类型的临时变量保持为空:var temp=listView1.SelectedItems[0]。Tag.GetType().ToString()@Chancho尝试将temp写入控制台/输出窗口/消息框,如果您不使用temp变量,它可能会被优化。只需使用
new Guid(value)
Guid.parse
、或
Guid.TryParse
对其进行分析,您就不必更改DB schemaAs@JGinSD说,我不会在varchar字段中存储GUID。数据完整性很重要——这就是为什么有这么多数据类型。如果可以的话,我会把它作为唯一的标识符。