Guid конвертируется в int32 - PullRequest
1 голос
/ 30 июня 2011

Я пытаюсь программно добавить предложение where к источнику LinqDatasource моего gridview, но получаю исключение, говорящее: «Operator» = «несовместим с типами операндов Guid и Int32»

if (e.CommandName == "getuser")
    {
        int index = Convert.ToInt32(e.CommandArgument);    
        GridViewRow selectedRow = GridView1.Rows[index];
        Guid id = new Guid(selectedRow.Cells[1].Text);

        LinqDataSource2.Where = "UserID = " + id;
        GridView1.DataSourceID = LinqDataSource2.ID;
        GridView1.DataBind();

    }

Кто-нибудь знает, как, когда и почему мой Guid конвертируется в int?

Fixed

добавил строку

LinqDataSource2.WhereParameters.Add("UserID", System.Data.DbType.Guid, id.ToString());

Я предполагаю, что int32 - это стандартный тип, когда в параметрах where ничего не задано, а только где. Просто угадайте, если кто-то знает больше, пожалуйста, сообщите мне.

Ответы [ 3 ]

3 голосов
/ 30 июня 2011

Как всегда с SQL - вам лучше использовать средства на вашем уровне доступа к данным, чтобы передавать ваши параметры как их фактический тип (с соответствующим уровнем данных -> преобразования базы данных, как требуется), а не использовать строку.

Похоже, что LinqDataSource имеет коллекцию WhereParameters , поэтому вы создадите свой элемент where где-то вроде:

LinqDataSource2.Where = "UserID = @UserID";

И затем добавите соответствующий параметр в коллекцию WhereParameters.(Обратите внимание, я не писал такой код, просто вытащил несколько быстрых деталей, но он выглядит правильно)

0 голосов
/ 30 июня 2011

Попробуйте это:

LinqDataSource2.Where = "UserID = '" + id.ToString("B") + "'";

Это передаст GUID в такой форме: {00000000-0000-0000-0000-000000000000}
Надеюсь, именно этого ожидает база данных.

0 голосов
/ 30 июня 2011

Если вы будете сравнивать свой идентификатор в виде строки с вашим GUID, вам нужно будет преобразовать поле GUID в строку. Самый простой способ добиться этого - вызвать метод ToString () в поле GUILD.

...