Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL查询抛出错误“;无法将参数值从Guid转换为字符串';_C#_Asp.net Core - Fatal编程技术网

C# SQL查询抛出错误“;无法将参数值从Guid转换为字符串';

C# SQL查询抛出错误“;无法将参数值从Guid转换为字符串';,c#,asp.net-core,C#,Asp.net Core,我试图获取用户名并将其放入TempData中,但当代码到达ExecuteReader()方法时,我收到一个错误 这是我的查询代码: var InvoiceId = TempData["newinvoice"]; TempData["invoiceid"] = InvoiceId; var UserID = TempData["UserID"]; string connection = "Data Source=.;Initi

我试图获取用户名并将其放入
TempData
中,但当代码到达
ExecuteReader()
方法时,我收到一个错误

这是我的查询代码:

var InvoiceId = TempData["newinvoice"];
TempData["invoiceid"] = InvoiceId;
var UserID = TempData["UserID"];

string connection = "Data Source=.;Initial Catalog=project;Integrated Security=true;";

using (SqlConnection sqlconn = new SqlConnection(connection))
{
    using (SqlCommand sqlcomm = new SqlCommand("SELECT UserName FROM AspNetUsers WHERE Id = @id"))
    {
        sqlcomm.Parameters.Add("@id", SqlDbType.VarChar).Value = UserID;

        using (SqlDataAdapter sda = new SqlDataAdapter())
        {
            sqlcomm.Connection = sqlconn;
            sqlconn.Open();

            sda.SelectCommand = sqlcomm;

            SqlDataReader sdr = sqlcomm.ExecuteReader();

            while (sdr.Read())
            {
                TempData["UserId"] = sdr["UserName"];
            }
        }
    }
}
TempData[“UserID”]
中的用户Id是
nvarchar(450)
而不是整数。我不知道为什么会发生这种异常-有什么帮助吗

注意:以下是我的一个用户ID的示例:

'aa776084-053e-452c-8b0d-b445cdbf457d'

看起来您的id是,如果是,我建议您更改数据库和代码以使用GUID

但是,要解决您的问题,您应该能够传入UserId并调用toString()(因为该值很可能是一个对象),例如:

如果只返回一个结果,可以使用


数据库中
Id
的类型是什么?我建议在所有声明中使用类型而不是
var
。这将使代码更易于阅读和调试,甚至可能在查询数据库之前向您显示错误所在@Origin
TempData[string]
返回一个
对象
,因此将
var
更改为
object
在这种情况下没有帮助。也就是说,如果UserId的类型是System.Guid,并且您的数据库字段实际上是UniqueIdentifier,那么您应该使用
SqlDbType.UniqueIdentifier)。Value=UserId
。如果字段是UniqueIdentifier,UserId是字符串,则使用
SqlDbType.UniqueIdentifier.Value=Guid.Parse(UserId)
。这完全取决于事物的实际类型。您关于TempData是nvarchar的说法是完全错误的,因为我们不知道用户ID的类型,所以很难猜测。但这些都是可能的组合,所以我建议尝试所有组合,直到其中一个有效。如果Guid.Parse抛出一个错误字符串
sqlcomm.Parameters.Add("@id", SqlDbType.NVarChar, UserID.ToString());
    using (SqlConnection sqlconn = new SqlConnection(connection))
    {
        using (SqlCommand sqlcomm = new SqlCommand("SELECT TOP 1 UserName from AspNetUsers where Id=@id", sqlconn)
        {
            sqlcomm.Parameters.Add("@id", SqlDbType.NVarChar, UserID.ToString());
            object result = sqlcomm.ExecuteScalar();
            if (result != null)
            {
                TempData["UserId"] = result.ToString(); // It looks like you're mixing UserId & UserName .
            }
        }
    }