2015-01-01 3 views
-2

Im пытается сортировать колонку в порядке (1 ... ...) в sql, используя asp.net и C#. После некоторых исследований мне кажется, что мне нужно изменить свой тип столбца в SQL Server на int, но это невозможно, поскольку столбец хранит номера домов, и я мог бы получить номер дома 10a (например), поэтому в настоящее время установлено к варчару. Из-за этого он неправильно сортирует столбец. Я попробовал лить соответствующий столбец как int, но затем при запуске приложения я получил ошибку для его привязки в gridview, я также пробовал использовать это как * 1, но все еще получаю ошибки в части привязки при запускеномера не сортируются по порядку

SQL Заявление

SELECT DISTINCT tblcontact.ContactID, tblcontact.Forename, tblcontact.Surname, 
    tbladdress.[House Number], tbladdress.AddressLine1, tbladdress.AddressLine2, 
    tblcontact.[Business Name] FROM tblcontact INNER JOIN tbladdress ON tblcontact.AddressID = tbladdress.AddressID 
    LEFT OUTER JOIN tblDonate 
    ON tblcontact.ContactID = tblDonate.ContactID 
    WHERE (tbladdress.CollectionArea = @CollectionArea) AND 
(tbladdress.AddressLine1 = @drpCollectionStreet) 
    ORDER BY tbladdress.[House Number] ASC 

Gridview Markup

        <asp:TemplateField HeaderText="House Number"> 
             <EditItemTemplate> 
              <asp:TextBox ID="txtHouseNum" runat="server" Text='<%# Bind("[House Number]") %>'></asp:TextBox> 
             </EditItemTemplate> 
             <ItemTemplate> 
              <asp:Label ID="lblHouseNum" runat="server" Text='<%# Bind("[House Number]") %>'></asp:Label> 
             </ItemTemplate> 
            </asp:TemplateField> 

Вот пример того, как его сортировки

21 
22 
27 
28 
5 
6 
8 
9 

Это, как я брошен как междунар который сортирует штраф в SQL, но я получаю сообщение об ошибке на Bind (выше)

SELECT DISTINCT tblcontact.ContactID, tblcontact.Forename, tblcontact.Surname, cast(tbladdress.[House Number] as int), 
tbladdress.AddressLine1, tbladdress.AddressLine2, tblcontact.[Business Name] 
FROM tblcontact INNER JOIN tbladdress ON tblcontact.AddressID = tbladdress.AddressID 
LEFT OUTER JOIN tblDonate ON tblcontact.ContactID = tblDonate.ContactID 
WHERE (tbladdress.CollectionArea = 'Queens Park') AND (tbladdress.AddressLine1 = 'Kings Road') 
ORDER BY cast(tbladdress.[House Number] as int) 

Ошибка во время выполнения

это ошибка при запуске (это самое значащий)

"House Number is neither a DataColumn nor a DataRelation for table DefaultView."} 
+1

Когда вы говорите «это не правильно сортировать столбец», как вы ожидаете, что это будет отсортирован, и как он действительно сортируется? Можете ли вы дать небольшой пример 3-5 строк «фактического» и «ожидаемого» поведения? –

+0

показать нам, где и как вы литая к Int – prospector

+0

ответов на quesions выше Я хочу, чтобы она сортируется численно по возрастанию – AShah

ответ

0

Правильный ответ представляет собой сочетание JohnS и NoDisplayName ответы благодаря вам и

select A.ContactID, 
       A.Forename, 
       A.Surname, 
       A.[House Number], 
       A.AddressLine1, 
       A.AddressLine2, 
       A.[Business Name] from (
SELECT DISTINCT tblcontact.ContactID, 
       tblcontact.Forename, 
       tblcontact.Surname, 
       tbladdress.[House Number], 
       tbladdress.AddressLine1, 
       tbladdress.AddressLine2, 
       tblcontact.[Business Name] 
FROM tblcontact 
     INNER JOIN tbladdress 
       ON tblcontact.AddressID = tbladdress.AddressID 
     LEFT OUTER JOIN tblDonate 
        ON tblcontact.ContactID = tblDonate.ContactID 
WHERE (tbladdress.CollectionArea = 'Queens Park') 
     AND (tbladdress.AddressLine1 = 'Kings Road')) A 
     ORDER BY CAST(SUBSTRING(A.[House Number], PATINDEX('%[0-9]%', A.[House Number]), 
       1 + PATINDEX('%[0-9][^0-9]%', A.[House Number] + ' ') - 
       PATINDEX('%[0-9]%',A.[House Number])) AS INT) 
1

Чтобы отсортировать номер улицы в численном выражении, вам необходимо указать их в качестве цифр. Беда, конечно, в том, что строки, такие как «10a», нельзя отличить как INT. Ответ состоит в том, чтобы извлечь числовые символы из столбца [Номер дома], а затем выполнить бросок. Ниже это делает для предложения ORDER BY:

... 
ORDER BY CAST(SUBSTRING(tbladdress.[House Number], PATINDEX('%[0-9]%', tbladdress.[House Number]), 
       1 + PATINDEX('%[0-9][^0-9]%', tbladdress.[House Number] + ' ') - 
       PATINDEX('%[0-9]%',tbladdress.[House Number])) AS INT) 

См http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/extracting-numbers-with-sql-server/ для объяснения, как сложных перспективных формул работ.

+0

литье в порядке дает ошибку - элементы ORDER BY должны отображаются в списке выбора, если указан параметр SELECT DISTINCT.Затем, когда я передал как int столбец [House Number], как указано выше, я получаю сообщение об ошибке в Runtime здесь -> '<% # Bind ("[Номер дома]")%> (ошибка выше) – AShah

1

Извлеките cast из списка column list. Оставайтесь только в order by, но он закажет результат.

select A.ContactID, 
       A.Forename, 
       A.Surname, 
       A.[House Number], 
       A.AddressLine1, 
       A.AddressLine2, 
       A.[Business Name] from (
SELECT DISTINCT tblcontact.ContactID, 
       tblcontact.Forename, 
       tblcontact.Surname, 
       tbladdress.[House Number], 
       tbladdress.AddressLine1, 
       tbladdress.AddressLine2, 
       tblcontact.[Business Name] 
FROM tblcontact 
     INNER JOIN tbladdress 
       ON tblcontact.AddressID = tbladdress.AddressID 
     LEFT OUTER JOIN tblDonate 
        ON tblcontact.ContactID = tblDonate.ContactID 
WHERE (tbladdress.CollectionArea = 'Queens Park') 
     AND (tbladdress.AddressLine1 = 'Kings Road')) A 
ORDER BY Cast(tbladdress.[House Number] AS INT) 
+0

это не работает, дает ниже ошибки (отсюда и причина размещения броска в столбце). Элементы ORDER BY должны появляться в списке выбора, если указан параметр SELECT DISTINCT. – AShah

+0

@AShah _ обновленный проверить сейчас –

+0

это выглядит неплохо, небольшая поправка Cast (tbladdress. [Номер дома] AS INT) должна быть Cast (A. [Номер дома] AS INT) - Также, если номер дома 11b, это не будет работать как он не может использоваться как целое число, я думаю, мне нужна комбинация этого ответа, а нижняя - от JohnS – AShah

Смежные вопросы